From d9794784bac54483660e438980d592b6ffe5c311 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Sun, 25 Jan 2009 20:29:03 -0800 Subject: [PATCH] CPU: Add a setCPU function to the interrupt objects. --- src/arch/alpha/interrupts.hh | 9 ++++++++- src/arch/sparc/interrupts.hh | 12 ++++++++++-- src/arch/x86/interrupts.hh | 9 +++++++++ src/cpu/base.cc | 3 +++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/arch/alpha/interrupts.hh b/src/arch/alpha/interrupts.hh index 89db134ff..f8e0ad4ef 100644 --- a/src/arch/alpha/interrupts.hh +++ b/src/arch/alpha/interrupts.hh @@ -48,6 +48,7 @@ class Interrupts : public SimObject bool newInfoSet; int newIpl; int newSummary; + BaseCPU * cpu; protected: uint64_t interrupts[NumInterruptLevels]; @@ -62,13 +63,19 @@ class Interrupts : public SimObject return dynamic_cast(_params); } - Interrupts(Params * p) : SimObject(p) + Interrupts(Params * p) : SimObject(p), cpu(NULL) { memset(interrupts, 0, sizeof(interrupts)); intstatus = 0; newInfoSet = false; } + void + setCPU(BaseCPU * _cpu) + { + cpu = _cpu; + } + void post(int int_num, int index) { diff --git a/src/arch/sparc/interrupts.hh b/src/arch/sparc/interrupts.hh index 66b3792b5..ec930e2b0 100644 --- a/src/arch/sparc/interrupts.hh +++ b/src/arch/sparc/interrupts.hh @@ -43,12 +43,20 @@ namespace SparcISA class Interrupts : public SimObject { - private: + BaseCPU * cpu; + uint64_t interrupts[NumInterruptTypes]; uint64_t intStatus; public: + + void + setCPU(BaseCPU * _cpu) + { + cpu = _cpu; + } + typedef SparcInterruptsParams Params; const Params * @@ -57,7 +65,7 @@ class Interrupts : public SimObject return dynamic_cast(_params); } - Interrupts(Params * p) : SimObject(p) + Interrupts(Params * p) : SimObject(p), cpu(NULL) { clearAll(); } diff --git a/src/arch/x86/interrupts.hh b/src/arch/x86/interrupts.hh index 8c7316217..c5e3bde0d 100644 --- a/src/arch/x86/interrupts.hh +++ b/src/arch/x86/interrupts.hh @@ -69,6 +69,7 @@ #include "sim/eventq.hh" class ThreadContext; +class BaseCPU; namespace X86ISA { @@ -182,12 +183,20 @@ class Interrupts : public BasicPioDevice, IntDev void requestInterrupt(uint8_t vector, uint8_t deliveryMode, bool level); + BaseCPU *cpu; + public: /* * Params stuff. */ typedef X86LocalApicParams Params; + void + setCPU(BaseCPU * newCPU) + { + cpu = newCPU; + } + void setClock(Tick newClock) { diff --git a/src/cpu/base.cc b/src/cpu/base.cc index 29095f12a..06fcebad8 100644 --- a/src/cpu/base.cc +++ b/src/cpu/base.cc @@ -194,6 +194,8 @@ BaseCPU::BaseCPU(Params *p) } } #if FULL_SYSTEM + interrupts->setCPU(this); + profileEvent = NULL; if (params()->profile) profileEvent = new ProfileEvent(this, params()->profile); @@ -348,6 +350,7 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU, Port *ic, Port *dc) #if FULL_SYSTEM interrupts = oldCPU->interrupts; + interrupts->setCPU(this); for (int i = 0; i < threadContexts.size(); ++i) threadContexts[i]->profileClear(); -- 2.30.2