summaryrefslogtreecommitdiff
path: root/src/dev/alpha/tsunami_io.cc
diff options
context:
space:
mode:
authorNathan Binkert <binkertn@umich.edu>2007-01-25 14:59:41 -0500
committerNathan Binkert <binkertn@umich.edu>2007-01-25 14:59:41 -0500
commit73dd0ea35716b90c8448d729273cc153888a223b (patch)
tree4b9e1477bcf945deb7268ddc9be2f150a8c29a6f /src/dev/alpha/tsunami_io.cc
parent4301e4cd08018eb56b4f196afcce9a8311f390b4 (diff)
downloadgem5-73dd0ea35716b90c8448d729273cc153888a223b.tar.xz
Instead of passing an int to represent time between python and C++
pass the tuple of python's struct_time and interpret that. Fixes a problem where the local timezone leaked into the time calculation. Also fix things so that the unix, python, and RTC data sheets all get the right time. Provide both years since 1900 and BCD two digit year. Put the date back at 1/1/2006 for now. --HG-- extra : convert_revision : 473244572f468de2cb579a3dd7ae296a6f81f5d7
Diffstat (limited to 'src/dev/alpha/tsunami_io.cc')
-rw-r--r--src/dev/alpha/tsunami_io.cc82
1 files changed, 69 insertions, 13 deletions
diff --git a/src/dev/alpha/tsunami_io.cc b/src/dev/alpha/tsunami_io.cc
index 38986b77e..d701dc98f 100644
--- a/src/dev/alpha/tsunami_io.cc
+++ b/src/dev/alpha/tsunami_io.cc
@@ -57,25 +57,77 @@ using namespace std;
//Should this be AlphaISA?
using namespace TheISA;
-TsunamiIO::RTC::RTC(const string &n, Tsunami* tsunami, time_t t, Tick i)
- : _name(n), event(tsunami, i), addr(0)
+TsunamiIO::RTC::RTC(const string &n, Tsunami* tsunami, const vector<int> &t,
+ bool bcd, Tick i)
+ : _name(n), event(tsunami, i), addr(0), year_is_bcd(bcd)
{
memset(clock_data, 0, sizeof(clock_data));
stat_regA = RTCA_32768HZ | RTCA_1024HZ;
stat_regB = RTCB_PRDC_IE |RTCB_BIN | RTCB_24HR;
+ if (year_is_bcd) {
+ // The RTC uses BCD for the last two digits in the year.
+ // They python year is a full year.
+ int _year = t[0] % 100;
+ int tens = _year / 10;
+ int ones = _year % 10;
+
+ year = (tens << 4) + ones;
+ } else {
+ // Even though the datasheet says that the year field should be
+ // interpreted as BCD, we just enter the number of years since
+ // 1900 since linux seems to be happy with that (and I believe
+ // that Tru64 was as well)
+ year = t[0] - 1900;
+ }
+
+ mon = t[1];
+ mday = t[2];
+ hour = t[3];
+ min = t[4];
+ sec = t[5];
+
+ // wday is defined to be in the range from 1 - 7 with 1 being Sunday.
+ // the value coming from python is in the range from 0 - 6 with 0 being
+ // Monday. Fix that here.
+ wday = t[6] + 2;
+ if (wday > 7)
+ wday -= 7;
+
+ DPRINTFN("Real-time clock set to %s", getDateString());
+}
+
+std::string
+TsunamiIO::RTC::getDateString()
+{
struct tm tm;
- gmtime_r(&t, &tm);
- sec = tm.tm_sec;
- min = tm.tm_min;
- hour = tm.tm_hour;
- wday = tm.tm_wday + 1;
- mday = tm.tm_mday;
- mon = tm.tm_mon + 1;
- year = tm.tm_year;
+ memset(&tm, 0, sizeof(tm));
+
+ if (year_is_bcd) {
+ // undo the BCD and conver to years since 1900 guessing that
+ // anything before 1970 is actually after 2000
+ int _year = (year >> 4) * 10 + (year & 0xf);
+ if (_year < 70)
+ _year += 100;
+
+ tm.tm_year = _year;
+ } else {
+ // number of years since 1900
+ tm.tm_year = year;
+ }
+
+ // unix is 0-11 for month
+ tm.tm_mon = mon - 1;
+ tm.tm_mday = mday;
+ tm.tm_hour = hour;
+ tm.tm_min = min;
+ tm.tm_sec = sec;
+
+ // to add more annoyance unix is 0 - 6 with 0 as sunday
+ tm.tm_wday = wday - 1;
- DPRINTFN("Real-time clock set to %s", asctime(&tm));
+ return asctime(&tm);
}
void
@@ -424,7 +476,8 @@ TsunamiIO::PITimer::Counter::CounterEvent::description()
TsunamiIO::TsunamiIO(Params *p)
: BasicPioDevice(p), tsunami(p->tsunami), pitimer(p->name + "pitimer"),
- rtc(p->name + ".rtc", p->tsunami, p->init_time, p->frequency)
+ rtc(p->name + ".rtc", p->tsunami, p->init_time, p->year_is_bcd,
+ p->frequency)
{
pioSize = 0x100;
@@ -649,7 +702,8 @@ BEGIN_DECLARE_SIM_OBJECT_PARAMS(TsunamiIO)
Param<Tick> frequency;
SimObjectParam<Platform *> platform;
SimObjectParam<System *> system;
- Param<time_t> time;
+ VectorParam<int> time;
+ Param<bool> year_is_bcd;
SimObjectParam<Tsunami *> tsunami;
END_DECLARE_SIM_OBJECT_PARAMS(TsunamiIO)
@@ -662,6 +716,7 @@ BEGIN_INIT_SIM_OBJECT_PARAMS(TsunamiIO)
INIT_PARAM(platform, "platform"),
INIT_PARAM(system, "system object"),
INIT_PARAM(time, "System time to use (0 for actual time"),
+ INIT_PARAM(year_is_bcd, ""),
INIT_PARAM(tsunami, "Tsunami")
END_INIT_SIM_OBJECT_PARAMS(TsunamiIO)
@@ -676,6 +731,7 @@ CREATE_SIM_OBJECT(TsunamiIO)
p->platform = platform;
p->system = system;
p->init_time = time;
+ p->year_is_bcd = year_is_bcd;
p->tsunami = tsunami;
return new TsunamiIO(p);
}