summaryrefslogtreecommitdiff
path: root/src/arch/riscv
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2019-09-02 21:26:12 -0700
committerGabe Black <gabeblack@google.com>2019-10-19 01:45:48 +0000
commitae390c629f2a10fd6a1c2eb50b7d3510d6e091da (patch)
tree51f12635838755ef7519bea1c72bfb96e0214336 /src/arch/riscv
parent1c047f8b92f5708bbef50d24cf47902d5da313e3 (diff)
downloadgem5-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.py4
-rw-r--r--src/arch/riscv/interrupts.hh7
-rw-r--r--src/arch/riscv/isa.cc31
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);
}