summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--SConscript1
-rw-r--r--arch/alpha/isa_traits.hh1
-rw-r--r--dev/ns_gige.hh2
-rw-r--r--dev/tsunami_io.cc42
-rw-r--r--dev/tsunami_io.hh2
-rw-r--r--kern/freebsd/freebsd_system.cc51
-rw-r--r--kern/freebsd/freebsd_system.hh16
7 files changed, 109 insertions, 6 deletions
diff --git a/SConscript b/SConscript
index 5d4fc42e1..508b76375 100644
--- a/SConscript
+++ b/SConscript
@@ -279,6 +279,7 @@ full_system_sources = Split('''
kern/kernel_stats.cc
kern/system_events.cc
kern/freebsd/freebsd_system.cc
+ kern/freebsd/freebsd_events.cc
kern/linux/linux_events.cc
kern/linux/linux_syscalls.cc
kern/linux/linux_system.cc
diff --git a/arch/alpha/isa_traits.hh b/arch/alpha/isa_traits.hh
index 9c7709a60..6c0c09b7a 100644
--- a/arch/alpha/isa_traits.hh
+++ b/arch/alpha/isa_traits.hh
@@ -287,6 +287,7 @@ const int ReturnAddressReg = TheISA::ReturnAddressReg;
const int ReturnValueReg = TheISA::ReturnValueReg;
const int ArgumentReg0 = TheISA::ArgumentReg0;
const int ArgumentReg1 = TheISA::ArgumentReg1;
+const int ArgumentReg2 = TheISA::ArgumentReg2;
const int BranchPredAddrShiftAmt = TheISA::BranchPredAddrShiftAmt;
const int MaxAddr = (Addr)-1;
diff --git a/dev/ns_gige.hh b/dev/ns_gige.hh
index f39731493..9007ea6cf 100644
--- a/dev/ns_gige.hh
+++ b/dev/ns_gige.hh
@@ -99,7 +99,7 @@ class Bus;
class PciConfigAll;
/**
- * NS DP82830 Ethernet device model
+ * NS DP83820 Ethernet device model
*/
class NSGigE : public PciDev
{
diff --git a/dev/tsunami_io.cc b/dev/tsunami_io.cc
index 5d5eba68e..7db55b321 100644
--- a/dev/tsunami_io.cc
+++ b/dev/tsunami_io.cc
@@ -52,6 +52,8 @@ using namespace std;
#define UNIX_YEAR_OFFSET 52
+struct tm TsunamiIO::tm = { 0 };
+
// Timer Event for Periodic interrupt of RTC
TsunamiIO::RTCEvent::RTCEvent(Tsunami* t, Tick i)
: Event(&mainEventQueue), tsunami(t), interval(i)
@@ -67,6 +69,9 @@ TsunamiIO::RTCEvent::process()
schedule(curTick + interval);
//Actually interrupt the processor here
tsunami->cchip->postRTC();
+
+ // For FreeBSD
+ tm.tm_sec++;
}
const char *
@@ -217,6 +222,9 @@ TsunamiIO::read(MemReqPtr &req, uint8_t *data)
case TSDEV_PIC1_MASK:
*(uint8_t*)data = ~mask1;
return No_Fault;
+ case TSDEV_PIC2_MASK:
+ *(uint8_t*)data = ~mask2;
+ return No_Fault;
case TSDEV_PIC1_ISR:
// !!! If this is modified 64bit case needs to be too
// Pal code has to do a 64 bit physical read because there is
@@ -261,6 +269,7 @@ TsunamiIO::read(MemReqPtr &req, uint8_t *data)
return No_Fault;
case RTC_DOM:
*(uint8_t *)data = tm.tm_mday;
+ return No_Fault;
case RTC_MON:
*(uint8_t *)data = tm.tm_mon + 1;
return No_Fault;
@@ -411,7 +420,38 @@ TsunamiIO::write(MemReqPtr &req, const uint8_t *data)
case TSDEV_KBD:
return No_Fault;
case TSDEV_RTC_DATA:
- panic("RTC Write not implmented (rtc.o won't work)\n");
+ switch(RTCAddress) {
+ case RTC_CNTRL_REGA:
+ return No_Fault;
+ case RTC_CNTRL_REGB:
+ return No_Fault;
+ case RTC_CNTRL_REGC:
+ return No_Fault;
+ case RTC_CNTRL_REGD:
+ return No_Fault;
+ case RTC_SEC:
+ tm.tm_sec = *(uint8_t *)data;
+ return No_Fault;
+ case RTC_MIN:
+ tm.tm_min = *(uint8_t *)data;
+ return No_Fault;
+ case RTC_HR:
+ tm.tm_hour = *(uint8_t *)data;
+ return No_Fault;
+ case RTC_DOW:
+ tm.tm_wday = *(uint8_t *)data;
+ return No_Fault;
+ case RTC_DOM:
+ tm.tm_mday = *(uint8_t *)data;
+ return No_Fault;
+ case RTC_MON:
+ tm.tm_mon = *(uint8_t *)data - 1;
+ return No_Fault;
+ case RTC_YEAR:
+ tm.tm_year = *(uint8_t *)data + UNIX_YEAR_OFFSET;
+ return No_Fault;
+ //panic("RTC Write not implmented (rtc.o won't work)\n");
+ }
default:
panic("I/O Write - va%#x size %d\n", req->vaddr, req->size);
}
diff --git a/dev/tsunami_io.hh b/dev/tsunami_io.hh
index d5d106db3..86c739285 100644
--- a/dev/tsunami_io.hh
+++ b/dev/tsunami_io.hh
@@ -51,7 +51,7 @@ class TsunamiIO : public PioDevice
/** The size of mappad from the above address */
static const Addr size = 0xff;
- struct tm tm;
+ static struct tm tm;
/**
* In Tsunami RTC only has two i/o ports one for data and one for
diff --git a/kern/freebsd/freebsd_system.cc b/kern/freebsd/freebsd_system.cc
index a22fda9dc..08d1af824 100644
--- a/kern/freebsd/freebsd_system.cc
+++ b/kern/freebsd/freebsd_system.cc
@@ -29,7 +29,7 @@
/**
* @file
* Modifications for the FreeBSD kernel. Based off of kern/linux/linux_system.cc.
- * Currently only used to skip DELAY function. -Ben
+ * Currently only used to skip DELAY function.
*
*/
@@ -64,11 +64,60 @@ FreebsdSystem::FreebsdSystem(Params *p)
skipDelayEvent = new SkipFuncEvent(&pcEventQueue, "DELAY");
if (kernelSymtab->findAddress("DELAY", addr))
skipDelayEvent->schedule(addr+sizeof(MachInst));
+
+ skipOROMEvent = new SkipFuncEvent(&pcEventQueue, "orm_identify");
+ if (kernelSymtab->findAddress("orm_identify", addr))
+ skipOROMEvent->schedule(addr+sizeof(MachInst));
+
+ skipAicEvent = new SkipFuncEvent(&pcEventQueue, "ahc_isa_identify");
+ if (kernelSymtab->findAddress("ahc_isa_identify", addr))
+ skipAicEvent->schedule(addr+sizeof(MachInst));
+
+ skipPNPEvent = new SkipFuncEvent(&pcEventQueue, "pnp_identify");
+ if (kernelSymtab->findAddress("pnp_identify", addr))
+ skipPNPEvent->schedule(addr+sizeof(MachInst));
+
+ skipATAEvent = new SkipFuncEvent(&pcEventQueue, "ata_attach");
+ if (kernelSymtab->findAddress("ata_attach", addr))
+ skipATAEvent->schedule(addr+sizeof(MachInst));
+
+ skipCalibrateClocks = new FreebsdSkipCalibrateClocksEvent(&pcEventQueue, "calibrate_clocks");
+ if (kernelSymtab->findAddress("calibrate_clocks", addr))
+ skipCalibrateClocks->schedule(addr + sizeof(MachInst) * 2);
+
}
+
FreebsdSystem::~FreebsdSystem()
{
delete skipDelayEvent;
+ delete skipOROMEvent;
+ delete skipAicEvent;
+ delete skipATAEvent;
+ delete skipPNPEvent;
+ delete skipCalibrateClocks;
+}
+
+
+void
+FreebsdSystem::doCalibrateClocks(ExecContext *xc)
+{
+ Addr ppc_vaddr = 0;
+ Addr timer_vaddr = 0;
+ Addr ppc_paddr = 0;
+ Addr timer_paddr = 0;
+
+ ppc_vaddr = (Addr)xc->regs.intRegFile[ArgumentReg1];
+ timer_vaddr = (Addr)xc->regs.intRegFile[ArgumentReg2];
+
+ ppc_paddr = vtophys(physmem, ppc_vaddr);
+ timer_paddr = vtophys(physmem, timer_vaddr);
+
+ uint8_t *ppc = physmem->dma_addr(ppc_paddr, sizeof(uint32_t));
+ uint8_t *timer = physmem->dma_addr(timer_paddr, sizeof(uint32_t));
+
+ *(uint32_t *)ppc = 2000000000;
+ *(uint32_t *)timer = 1193180;
}
diff --git a/kern/freebsd/freebsd_system.hh b/kern/freebsd/freebsd_system.hh
index 8caa81cbc..3e9867733 100644
--- a/kern/freebsd/freebsd_system.hh
+++ b/kern/freebsd/freebsd_system.hh
@@ -32,10 +32,11 @@
#include "sim/host.hh"
#include "sim/system.hh"
#include "targetarch/isa_traits.hh"
+#include "kern/freebsd/freebsd_events.hh"
/**
- * This class skips a lengthy function in the FreeBSD kernel.
+ * This class skips lengthy functions in the FreeBSD kernel.
*/
class FreebsdSystem : public System
{
@@ -44,10 +45,21 @@ class FreebsdSystem : public System
/** PC based event to skip the DELAY call */
SkipFuncEvent *skipDelayEvent;
+ SkipFuncEvent *skipOROMEvent;
+
+ SkipFuncEvent *skipAicEvent;
+
+ SkipFuncEvent *skipPNPEvent;
+
+ SkipFuncEvent *skipATAEvent;
+
+ FreebsdSkipCalibrateClocksEvent *skipCalibrateClocks;
+
public:
FreebsdSystem(Params *p);
~FreebsdSystem();
+ void doCalibrateClocks(ExecContext *xc);
};
-#endif // __KERN_LINUX_LINUX_SYSTEM_HH__
+#endif // __KERN_FREEBSD_FREEBSD_SYSTEM_HH__