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/arch/riscv | |
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/arch/riscv')
-rw-r--r-- | src/arch/riscv/RiscvInterrupts.py | 4 | ||||
-rw-r--r-- | src/arch/riscv/interrupts.hh | 7 | ||||
-rw-r--r-- | src/arch/riscv/isa.cc | 31 |
3 files changed, 29 insertions, 13 deletions
diff --git a/src/arch/riscv/RiscvInterrupts.py b/src/arch/riscv/RiscvInterrupts.py index 57b29b4ca..7e63dedea 100644 --- a/src/arch/riscv/RiscvInterrupts.py +++ b/src/arch/riscv/RiscvInterrupts.py @@ -31,9 +31,9 @@ # Sven Karlsson # Alec Roelke -from m5.SimObject import SimObject +from m5.objects.BaseInterrupts import BaseInterrupts -class RiscvInterrupts(SimObject): +class RiscvInterrupts(BaseInterrupts): type = 'RiscvInterrupts' cxx_class = 'RiscvISA::Interrupts' cxx_header = 'arch/riscv/interrupts.hh' diff --git a/src/arch/riscv/interrupts.hh b/src/arch/riscv/interrupts.hh index ed946879b..509b48391 100644 --- a/src/arch/riscv/interrupts.hh +++ b/src/arch/riscv/interrupts.hh @@ -34,6 +34,7 @@ #include <bitset> #include <memory> +#include "arch/generic/interrupts.hh" #include "arch/riscv/faults.hh" #include "arch/riscv/registers.hh" #include "base/logging.hh" @@ -51,7 +52,7 @@ namespace RiscvISA { * This is based on version 1.10 of the RISC-V privileged ISA reference, * chapter 3.1.14. */ -class Interrupts : public SimObject +class Interrupts : public BaseInterrupts { private: BaseCPU * cpu; @@ -67,7 +68,7 @@ class Interrupts : public SimObject return dynamic_cast<const Params *>(_params); } - Interrupts(Params * p) : SimObject(p), cpu(nullptr), ip(0), ie(0) {} + Interrupts(Params * p) : BaseInterrupts(p), cpu(nullptr), ip(0), ie(0) {} void setCPU(BaseCPU * _cpu) { cpu = _cpu; } @@ -92,7 +93,7 @@ class Interrupts : public SimObject } Fault - getInterrupt(ThreadContext *tc) const + getInterrupt(ThreadContext *tc) { assert(checkInterrupts(tc)); std::bitset<NumInterruptTypes> mask = globalMask(tc); diff --git a/src/arch/riscv/isa.cc b/src/arch/riscv/isa.cc index cc86752ab..0fa730533 100644 --- a/src/arch/riscv/isa.cc +++ b/src/arch/riscv/isa.cc @@ -34,6 +34,7 @@ #include <set> #include <sstream> +#include "arch/riscv/interrupts.hh" #include "arch/riscv/registers.hh" #include "base/bitfield.hh" #include "cpu/base.hh" @@ -142,11 +143,17 @@ ISA::readMiscReg(int misc_reg, ThreadContext *tc) return 0; } case MISCREG_IP: - return tc->getCpuPtr()->getInterruptController(tc->threadId()) - ->readIP(); + { + auto ic = dynamic_cast<RiscvISA::Interrupts *>( + tc->getCpuPtr()->getInterruptController(tc->threadId())); + return ic->readIP(); + } case MISCREG_IE: - return tc->getCpuPtr()->getInterruptController(tc->threadId()) - ->readIE(); + { + auto ic = dynamic_cast<RiscvISA::Interrupts *>( + tc->getCpuPtr()->getInterruptController(tc->threadId())); + return ic->readIE(); + } default: // Try reading HPM counters // As a placeholder, all HPM counters are just cycle counters @@ -185,11 +192,19 @@ ISA::setMiscReg(int misc_reg, RegVal val, ThreadContext *tc) } else { switch (misc_reg) { case MISCREG_IP: - return tc->getCpuPtr()->getInterruptController(tc->threadId()) - ->setIP(val); + { + auto ic = dynamic_cast<RiscvISA::Interrupts *>( + tc->getCpuPtr()->getInterruptController(tc->threadId())); + ic->setIP(val); + } + break; case MISCREG_IE: - return tc->getCpuPtr()->getInterruptController(tc->threadId()) - ->setIE(val); + { + auto ic = dynamic_cast<RiscvISA::Interrupts *>( + tc->getCpuPtr()->getInterruptController(tc->threadId())); + ic->setIE(val); + } + break; default: setMiscRegNoEffect(misc_reg, val); } |