diff options
Diffstat (limited to 'kern/tru64')
-rw-r--r-- | kern/tru64/tru64_system.cc | 46 | ||||
-rw-r--r-- | kern/tru64/tru64_system.hh | 12 |
2 files changed, 32 insertions, 26 deletions
diff --git a/kern/tru64/tru64_system.cc b/kern/tru64/tru64_system.cc index 823a00e5a..a7940ed1f 100644 --- a/kern/tru64/tru64_system.cc +++ b/kern/tru64/tru64_system.cc @@ -72,10 +72,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param, fatal("Could not load PALcode file %s", palcode); pal->loadSections(physmem, true); - // copy of initial reg file contents - initRegs = new RegFile; - memset(initRegs, 0, sizeof(RegFile)); - // Load console file console->loadSections(physmem, true); @@ -90,10 +86,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param, "Kernel entry = %#x\n", kernelStart, kernelEnd, kernelEntry); - // Setup kernel boot parameters - initRegs->pc = 0x4001; - initRegs->npc = initRegs->pc + sizeof(MachInst); - DPRINTF(Loader, "Kernel loaded...\n"); kernelPanicEvent = new BreakPCEvent(&pcEventQueue, "kernel panic"); @@ -164,8 +156,6 @@ Tru64System::Tru64System(const string _name, const uint64_t _init_param, Tru64System::~Tru64System() { - delete initRegs; - delete kernel; delete console; @@ -184,24 +174,40 @@ Tru64System::~Tru64System() } -void -Tru64System::init(ExecContext *xc) +int +Tru64System::registerExecContext(ExecContext *xc) { - xc->regs = *initRegs; + int xcIndex = System::registerExecContext(xc); + + if (xcIndex == 0) { + xc->setStatus(ExecContext::Active); + } + + RemoteGDB *rgdb = new RemoteGDB(this, xc); + GDBListener *gdbl = new GDBListener(rgdb, 7000 + xcIndex); + gdbl->listen(); - remoteGDB = new RemoteGDB(this, xc); - gdbListen = new GDBListener(remoteGDB, 7000); - gdbListen->listen(); + if (remoteGDB.size() <= xcIndex) { + remoteGDB.resize(xcIndex+1); + } + + remoteGDB[xcIndex] = rgdb; + + return xcIndex; +} - // Reset the system - // - TheISA::init(physmem, &xc->regs); + +void +Tru64System::replaceExecContext(ExecContext *xc, int xcIndex) +{ + System::replaceExecContext(xcIndex, xc); + remoteGDB[xcIndex]->replaceExecContext(xc); } bool Tru64System::breakpoint() { - return remoteGDB->trap(ALPHA_KENTRY_IF); + return remoteGDB[0]->trap(ALPHA_KENTRY_IF); } BEGIN_DECLARE_SIM_OBJECT_PARAMS(Tru64System) diff --git a/kern/tru64/tru64_system.hh b/kern/tru64/tru64_system.hh index f1b8bb532..e0d2bedf7 100644 --- a/kern/tru64/tru64_system.hh +++ b/kern/tru64/tru64_system.hh @@ -29,6 +29,8 @@ #ifndef __TRU64_SYSTEM_HH__ #define __TRU64_SYSTEM_HH__ +#include <vector> + #include "sim/system.hh" #include "targetarch/isa_traits.hh" @@ -48,8 +50,6 @@ class AlphaArguments; class Tru64System : public System { private: - ExecContext *xc; - EcoffObject *kernel; EcoffObject *console; @@ -67,15 +67,14 @@ class Tru64System : public System DumpMbufEvent *dumpMbufEvent; private: - RegFile *initRegs; Addr kernelStart; Addr kernelEnd; Addr kernelEntry; public: - RemoteGDB *remoteGDB; - GDBListener *gdbListen; + std::vector<RemoteGDB *> remoteGDB; + std::vector<GDBListener *> gdbListen; public: Tru64System(const std::string _name, @@ -88,7 +87,8 @@ class Tru64System : public System const std::string &boot_osflags); ~Tru64System(); - void init(ExecContext *xc); + int registerExecContext(ExecContext *xc); + void replaceExecContext(ExecContext *xc, int xcIndex); Addr getKernelStart() const { return kernelStart; } Addr getKernelEnd() const { return kernelEnd; } |