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 <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
Alec Roelke
2018-02-18 22:28:44 -05:00
committed by Alec Roelke
parent c5baffb530
commit a3be0a4cbc
2 changed files with 14 additions and 16 deletions

View File

@@ -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<RiscvSystem *>(tc->getSystemPtr())->resetVect();
tc->pcState(pc);

View File

@@ -95,24 +95,15 @@ class RiscvFault : public FaultBase
class Reset : public FaultBase
{
private:
const FaultName _name;
public:
Reset()
: _name("reset")
{}
public:
Reset() : _name("reset") {}
FaultName name() const override { return _name; }
FaultName
name() const override
{
return _name;
}
void
invoke(ThreadContext *tc, const StaticInstPtr &inst =
StaticInst::nullStaticInstPtr) override;
private:
const FaultName _name;
void invoke(ThreadContext *tc, const StaticInstPtr &inst =
StaticInst::nullStaticInstPtr) override;
};
class InstFault : public RiscvFault