diff options
author | Gabe Black <gabeblack@google.com> | 2019-09-02 21:26:12 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2019-10-19 01:45:48 +0000 |
commit | ae390c629f2a10fd6a1c2eb50b7d3510d6e091da (patch) | |
tree | 51f12635838755ef7519bea1c72bfb96e0214336 /src/cpu | |
parent | 1c047f8b92f5708bbef50d24cf47902d5da313e3 (diff) | |
download | gem5-ae390c629f2a10fd6a1c2eb50b7d3510d6e091da.tar.xz |
arch: Make a base class for Interrupts.
That abstracts the ISA further from the CPU, getting us a small step
closer to being able to build in more than one ISA at a time.
Change-Id: Ibf7e26a3df411ffe994ac1e11d2a53b656863223
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/20831
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>
Diffstat (limited to 'src/cpu')
-rw-r--r-- | src/cpu/BaseCPU.py | 9 | ||||
-rw-r--r-- | src/cpu/base.hh | 6 | ||||
-rw-r--r-- | src/cpu/kvm/base.hh | 1 | ||||
-rw-r--r-- | src/cpu/kvm/x86_cpu.cc | 10 |
4 files changed, 12 insertions, 14 deletions
diff --git a/src/cpu/BaseCPU.py b/src/cpu/BaseCPU.py index 143ee9224..e17e26a11 100644 --- a/src/cpu/BaseCPU.py +++ b/src/cpu/BaseCPU.py @@ -66,44 +66,37 @@ if buildEnv['TARGET_ISA'] == 'alpha': from m5.objects.AlphaTLB import AlphaDTB as ArchDTB, AlphaITB as ArchITB from m5.objects.AlphaInterrupts import AlphaInterrupts as ArchInterrupts from m5.objects.AlphaISA import AlphaISA as ArchISA - ArchInterruptsParam = VectorParam.AlphaInterrupts ArchISAsParam = VectorParam.AlphaISA elif buildEnv['TARGET_ISA'] == 'sparc': from m5.objects.SparcTLB import SparcTLB as ArchDTB, SparcTLB as ArchITB from m5.objects.SparcInterrupts import SparcInterrupts as ArchInterrupts from m5.objects.SparcISA import SparcISA as ArchISA - ArchInterruptsParam = VectorParam.SparcInterrupts ArchISAsParam = VectorParam.SparcISA elif buildEnv['TARGET_ISA'] == 'x86': from m5.objects.X86TLB import X86TLB as ArchDTB, X86TLB as ArchITB from m5.objects.X86LocalApic import X86LocalApic as ArchInterrupts from m5.objects.X86ISA import X86ISA as ArchISA - ArchInterruptsParam = VectorParam.X86LocalApic ArchISAsParam = VectorParam.X86ISA elif buildEnv['TARGET_ISA'] == 'mips': from m5.objects.MipsTLB import MipsTLB as ArchDTB, MipsTLB as ArchITB from m5.objects.MipsInterrupts import MipsInterrupts as ArchInterrupts from m5.objects.MipsISA import MipsISA as ArchISA - ArchInterruptsParam = VectorParam.MipsInterrupts ArchISAsParam = VectorParam.MipsISA elif buildEnv['TARGET_ISA'] == 'arm': from m5.objects.ArmTLB import ArmTLB as ArchDTB, ArmTLB as ArchITB from m5.objects.ArmTLB import ArmStage2IMMU, ArmStage2DMMU from m5.objects.ArmInterrupts import ArmInterrupts as ArchInterrupts from m5.objects.ArmISA import ArmISA as ArchISA - ArchInterruptsParam = VectorParam.ArmInterrupts ArchISAsParam = VectorParam.ArmISA elif buildEnv['TARGET_ISA'] == 'power': from m5.objects.PowerTLB import PowerTLB as ArchDTB, PowerTLB as ArchITB from m5.objects.PowerInterrupts import PowerInterrupts as ArchInterrupts from m5.objects.PowerISA import PowerISA as ArchISA - ArchInterruptsParam = VectorParam.PowerInterrupts ArchISAsParam = VectorParam.PowerISA elif buildEnv['TARGET_ISA'] == 'riscv': from m5.objects.RiscvTLB import RiscvTLB as ArchDTB, RiscvTLB as ArchITB from m5.objects.RiscvInterrupts import RiscvInterrupts as ArchInterrupts from m5.objects.RiscvISA import RiscvISA as ArchISA - ArchInterruptsParam = VectorParam.RiscvInterrupts ArchISAsParam = VectorParam.RiscvISA else: print("Don't know what object types to use for ISA %s" % @@ -186,7 +179,7 @@ class BaseCPU(ClockedObject): dstage2_mmu = ArmStage2DMMU() elif buildEnv['TARGET_ISA'] == 'power': UnifiedTLB = Param.Bool(True, "Is this a Unified TLB?") - interrupts = ArchInterruptsParam([], "Interrupt Controller") + interrupts = VectorParam.BaseInterrupts([], "Interrupt Controller") isa = ArchISAsParam([], "ISA instance") max_insts_all_threads = Param.Counter(0, diff --git a/src/cpu/base.hh b/src/cpu/base.hh index 383ae8185..cb23cb1ba 100644 --- a/src/cpu/base.hh +++ b/src/cpu/base.hh @@ -54,7 +54,7 @@ #if THE_ISA == NULL_ISA #include "arch/null/cpu_dummy.hh" #else -#include "arch/interrupts.hh" +#include "arch/generic/interrupts.hh" #include "arch/isa_traits.hh" #include "arch/microcode_rom.hh" #include "base/statistics.hh" @@ -219,10 +219,10 @@ class BaseCPU : public ClockedObject TheISA::MicrocodeRom microcodeRom; protected: - std::vector<TheISA::Interrupts*> interrupts; + std::vector<BaseInterrupts*> interrupts; public: - TheISA::Interrupts * + BaseInterrupts * getInterruptController(ThreadID tid) { if (interrupts.empty()) diff --git a/src/cpu/kvm/base.hh b/src/cpu/kvm/base.hh index 7bf518f04..8d1258b4c 100644 --- a/src/cpu/kvm/base.hh +++ b/src/cpu/kvm/base.hh @@ -52,6 +52,7 @@ #include "cpu/kvm/vm.hh" #include "cpu/base.hh" #include "cpu/simple_thread.hh" +#include "sim/faults.hh" /** Signal to use to trigger exits from KVM */ #define KVM_KICK_SIGNAL SIGRTMIN diff --git a/src/cpu/kvm/x86_cpu.cc b/src/cpu/kvm/x86_cpu.cc index 681e14200..5d2250dae 100644 --- a/src/cpu/kvm/x86_cpu.cc +++ b/src/cpu/kvm/x86_cpu.cc @@ -38,6 +38,8 @@ #include "arch/registers.hh" #include "arch/x86/cpuid.hh" +#include "arch/x86/faults.hh" +#include "arch/x86/interrupts.hh" #include "arch/x86/regs/msr.hh" #include "arch/x86/utility.hh" #include "cpu/kvm/base.hh" @@ -1185,8 +1187,10 @@ X86KvmCPU::kvmRun(Tick ticks) { struct kvm_run &kvm_run(*getKvmRunState()); - if (interrupts[0]->checkInterruptsRaw()) { - if (interrupts[0]->hasPendingUnmaskable()) { + auto *lapic = dynamic_cast<X86ISA::Interrupts *>(interrupts[0]); + + if (lapic->checkInterruptsRaw()) { + if (lapic->hasPendingUnmaskable()) { DPRINTF(KvmInt, "Delivering unmaskable interrupt.\n"); syncThreadContext(); @@ -1198,7 +1202,7 @@ X86KvmCPU::kvmRun(Tick ticks) // the thread context and check if there are /really/ // interrupts that should be delivered now. syncThreadContext(); - if (interrupts[0]->checkInterrupts(tc)) { + if (lapic->checkInterrupts(tc)) { DPRINTF(KvmInt, "M5 has pending interrupts, delivering interrupt.\n"); |