diff options
Diffstat (limited to 'src/arch/alpha')
-rw-r--r-- | src/arch/alpha/linux/system.cc | 7 | ||||
-rw-r--r-- | src/arch/alpha/linux/system.hh | 6 | ||||
-rw-r--r-- | src/arch/alpha/system.cc | 70 | ||||
-rw-r--r-- | src/arch/alpha/system.hh | 10 |
4 files changed, 69 insertions, 24 deletions
diff --git a/src/arch/alpha/linux/system.cc b/src/arch/alpha/linux/system.cc index e42553b63..db3c16d7e 100644 --- a/src/arch/alpha/linux/system.cc +++ b/src/arch/alpha/linux/system.cc @@ -113,6 +113,12 @@ LinuxAlphaSystem::initState() else panic("could not find dp264_mv\n"); +} + +void +LinuxAlphaSystem::setupFuncEvents() +{ + AlphaSystem::setupFuncEvents(); #ifndef NDEBUG kernelPanicEvent = addKernelFuncEvent<BreakPCEvent>("panic"); if (!kernelPanicEvent) @@ -148,6 +154,7 @@ LinuxAlphaSystem::initState() // re-enable, but we should find a better way to turn it on than // using DTRACE(Thread), since looking at a trace flag at tick 0 // leads to non-intuitive behavior with --trace-start. + Addr addr = 0; if (false && kernelSymtab->findAddress("alpha_switch_to", addr)) { printThreadEvent = new PrintThreadInfo(&pcEventQueue, "threadinfo", addr + sizeof(MachInst) * 6); diff --git a/src/arch/alpha/linux/system.hh b/src/arch/alpha/linux/system.hh index 5436a27b2..345c17bb7 100644 --- a/src/arch/alpha/linux/system.hh +++ b/src/arch/alpha/linux/system.hh @@ -123,6 +123,12 @@ class LinuxAlphaSystem : public AlphaSystem /** Grab the PCBB of the idle process when it starts */ IdleStartEvent *idleStartEvent; + protected: + /** Setup all the function events. Must be done after init() for Alpha since + * fixFuncEvent() requires a function port + */ + virtual void setupFuncEvents(); + public: typedef LinuxAlphaSystemParams Params; LinuxAlphaSystem(Params *p); diff --git a/src/arch/alpha/system.cc b/src/arch/alpha/system.cc index 8d6629169..51e1d7e07 100644 --- a/src/arch/alpha/system.cc +++ b/src/arch/alpha/system.cc @@ -63,6 +63,27 @@ AlphaSystem::AlphaSystem(Params *p) pal = createObjectFile(params()->pal); if (pal == NULL) fatal("Could not load PALcode file %s", params()->pal); + + // load symbols + if (!console->loadGlobalSymbols(consoleSymtab)) + panic("could not load console symbols\n"); + + if (!pal->loadGlobalSymbols(palSymtab)) + panic("could not load pal symbols\n"); + + if (!pal->loadLocalSymbols(palSymtab)) + panic("could not load pal symbols\n"); + + if (!console->loadGlobalSymbols(debugSymbolTable)) + panic("could not load console symbols\n"); + + if (!pal->loadGlobalSymbols(debugSymbolTable)) + panic("could not load pal symbols\n"); + + if (!pal->loadLocalSymbols(debugSymbolTable)) + panic("could not load pal symbols\n"); + + } AlphaSystem::~AlphaSystem() @@ -78,6 +99,8 @@ AlphaSystem::~AlphaSystem() void AlphaSystem::initState() { + Addr addr = 0; + // Moved from the constructor to here since it relies on the // address map being resolved in the interconnect @@ -88,30 +111,6 @@ AlphaSystem::initState() pal->loadSections(physProxy, loadAddrMask); console->loadSections(physProxy, loadAddrMask); - // load symbols - if (!console->loadGlobalSymbols(consoleSymtab)) - panic("could not load console symbols\n"); - - if (!pal->loadGlobalSymbols(palSymtab)) - panic("could not load pal symbols\n"); - - if (!pal->loadLocalSymbols(palSymtab)) - panic("could not load pal symbols\n"); - - if (!console->loadGlobalSymbols(debugSymbolTable)) - panic("could not load console symbols\n"); - - if (!pal->loadGlobalSymbols(debugSymbolTable)) - panic("could not load pal symbols\n"); - - if (!pal->loadLocalSymbols(debugSymbolTable)) - panic("could not load pal symbols\n"); - - Addr addr = 0; -#ifndef NDEBUG - consolePanicEvent = addConsoleFuncEvent<BreakPCEvent>("panic"); -#endif - /** * Copy the osflags (kernel arguments) into the consoles * memory. (Presently Linux does not use the console service @@ -135,6 +134,29 @@ AlphaSystem::initState() virtProxy.write(addr+0x58, data); } else panic("could not find hwrpb\n"); + + // Setup all the function events now that we have a system and a symbol + // table + setupFuncEvents(); +} + +void +AlphaSystem::loadState(Checkpoint *cp) +{ + System::loadState(cp); + + // Setup all the function events now that we have a system and a symbol + // table + setupFuncEvents(); + +} + +void +AlphaSystem::setupFuncEvents() +{ +#ifndef NDEBUG + consolePanicEvent = addConsoleFuncEvent<BreakPCEvent>("panic"); +#endif } /** diff --git a/src/arch/alpha/system.hh b/src/arch/alpha/system.hh index 0e809cb94..d832dfe77 100644 --- a/src/arch/alpha/system.hh +++ b/src/arch/alpha/system.hh @@ -62,6 +62,10 @@ class AlphaSystem : public System virtual void serialize(std::ostream &os); virtual void unserialize(Checkpoint *cp, const std::string §ion); + /** Override loadState to provide a path to call setupFuncEvents() + */ + virtual void loadState(Checkpoint *cp); + /** * Set the m5AlphaAccess pointer in the console */ @@ -89,6 +93,12 @@ class AlphaSystem : public System const Params *params() const { return (const Params *)_params; } + + /** Setup all the function events. Must be done after init() for Alpha since + * fixFuncEvent() requires a function port + */ + virtual void setupFuncEvents(); + /** Add a function-based event to PALcode. */ template <class T> T * |