diff options
-rw-r--r-- | SConscript | 1 | ||||
-rw-r--r-- | arch/alpha/isa_traits.hh | 1 | ||||
-rw-r--r-- | dev/ns_gige.hh | 2 | ||||
-rw-r--r-- | dev/tsunami_io.cc | 42 | ||||
-rw-r--r-- | dev/tsunami_io.hh | 2 | ||||
-rw-r--r-- | kern/freebsd/freebsd_system.cc | 51 | ||||
-rw-r--r-- | kern/freebsd/freebsd_system.hh | 16 |
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__ |