From a3be0a4cbc2665b91e1d83e25cfe709dd100ce5d Mon Sep 17 00:00:00 2001 From: Alec Roelke Date: Sun, 18 Feb 2018 22:28:44 -0500 Subject: [PATCH] arch-riscv: Fix reset function and style In addition to fixing some style issues with resetting, this patch fixes what happens on reset. The RISC-V privileged ISA reference manual says that, on reset: 1. Privilege mode is set to M 2. mstatus.mie <- 0; mstatus.mprv <- 0 3. PC <- reset vector 4. mcause <- reset cause (0 if there is no distinguishing causes) 5. Everything else is undefined Because of 5, everything else will be left alone Change-Id: I81bdf7a88b08874e3c3d5fc6c7f3ca2d796496b8 Reviewed-on: https://gem5-review.googlesource.com/c/14376 Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power --- src/arch/riscv/faults.cc | 7 +++++++ src/arch/riscv/faults.hh | 23 +++++++---------------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/arch/riscv/faults.cc b/src/arch/riscv/faults.cc index b5f3d078b..a151334c4 100644 --- a/src/arch/riscv/faults.cc +++ b/src/arch/riscv/faults.cc @@ -131,6 +131,13 @@ void Reset::invoke(ThreadContext *tc, const StaticInstPtr &inst) tc->clearArchRegs(); } + tc->setMiscReg(MISCREG_PRV, PRV_M); + STATUS status = tc->readMiscReg(MISCREG_STATUS); + status.mie = 0; + status.mprv = 0; + tc->setMiscReg(MISCREG_STATUS, status); + tc->setMiscReg(MISCREG_MCAUSE, 0); + // Advance the PC to the implementation-defined reset vector PCState pc = static_cast(tc->getSystemPtr())->resetVect(); tc->pcState(pc); diff --git a/src/arch/riscv/faults.hh b/src/arch/riscv/faults.hh index d9cb44c3d..2176f889b 100644 --- a/src/arch/riscv/faults.hh +++ b/src/arch/riscv/faults.hh @@ -95,24 +95,15 @@ class RiscvFault : public FaultBase class Reset : public FaultBase { + private: + const FaultName _name; - public: - Reset() - : _name("reset") - {} - - FaultName - name() const override - { - return _name; - } - - void - invoke(ThreadContext *tc, const StaticInstPtr &inst = - StaticInst::nullStaticInstPtr) override; + public: + Reset() : _name("reset") {} + FaultName name() const override { return _name; } - private: - const FaultName _name; + void invoke(ThreadContext *tc, const StaticInstPtr &inst = + StaticInst::nullStaticInstPtr) override; }; class InstFault : public RiscvFault -- 2.30.2