Used the Priv and new HPriv instruction formats, which have been tweaked to let some checks be done by the misc reg file.
--HG-- extra : convert_revision : efee709cbab706bdb8ef7010ce153cd75a0a2ec6
This commit is contained in:
parent
a433cf140e
commit
981471c31d
2 changed files with 17 additions and 9 deletions
|
@ -325,12 +325,12 @@ decode OP default Unknown::unknown()
|
|||
0x28: rdasr({{
|
||||
Rd = xc->readMiscRegWithEffect(RS1 + AsrStart, fault);
|
||||
}});
|
||||
0x29: rdhpr({{
|
||||
0x29: HPriv::rdhpr({{
|
||||
// XXX Need to protect with format that traps non-priv/priv
|
||||
// access
|
||||
Rd = xc->readMiscRegWithEffect(RS1 + HprStart, fault);
|
||||
}});
|
||||
0x2A: rdpr({{
|
||||
0x2A: Priv::rdpr({{
|
||||
// XXX Need to protect with format that traps non-priv
|
||||
// access
|
||||
Rd = xc->readMiscRegWithEffect(RS1 + PrStart, fault);
|
||||
|
@ -397,15 +397,15 @@ decode OP default Unknown::unknown()
|
|||
0x0: BasicOperate::saved({{/*Boogy Boogy*/}});
|
||||
0x1: BasicOperate::restored({{/*Boogy Boogy*/}});
|
||||
}
|
||||
0x32: wrpr({{
|
||||
0x32: Priv::wrpr({{
|
||||
// XXX Need to protect with format that traps non-priv
|
||||
// access
|
||||
xc->setMiscRegWithEffect(RD + PrStart, Rs1 ^ Rs2_or_imm13);
|
||||
fault = xc->setMiscRegWithEffect(RD + PrStart, Rs1 ^ Rs2_or_imm13);
|
||||
}});
|
||||
0x33: wrhpr({{
|
||||
0x33: HPriv::wrhpr({{
|
||||
// XXX Need to protect with format that traps non-priv/priv
|
||||
// access
|
||||
xc->setMiscRegWithEffect(RD + HprStart, Rs1 ^ Rs2_or_imm13);
|
||||
fault = xc->setMiscRegWithEffect(RD + HprStart, Rs1 ^ Rs2_or_imm13);
|
||||
}});
|
||||
0x34: Trap::fpop1({{fault = new FpDisabled;}});
|
||||
0x35: Trap::fpop2({{fault = new FpDisabled;}});
|
||||
|
@ -549,7 +549,7 @@ decode OP default Unknown::unknown()
|
|||
NNPC = Tnpc + 4;
|
||||
Tl = Tl - 1;
|
||||
}});
|
||||
0x1: BasicOperate::retry({{
|
||||
0x1: Priv::retry({{
|
||||
if(Tl == 0)
|
||||
return new IllegalInstruction;
|
||||
Cwp = Tstate<4:0>;
|
||||
|
|
|
@ -87,9 +87,10 @@ def template PrivExecute {{
|
|||
if(%(check)s)
|
||||
return new PrivilegedAction;
|
||||
|
||||
Fault fault = NoFault;
|
||||
%(code)s;
|
||||
%(op_wb)s;
|
||||
return NoFault;
|
||||
return fault;
|
||||
}
|
||||
}};
|
||||
|
||||
|
@ -116,10 +117,17 @@ let {{
|
|||
|
||||
// Primary format for integer operate instructions:
|
||||
def format Priv(code, *opt_flags) {{
|
||||
checkCode = "((xc->readMiscReg(PrStart + MISCREG_PSTATE))<2:2>)"
|
||||
checkCode = '''((xc->readMiscReg(PrStart + MISCREG_PSTATE))<2:2>) ||
|
||||
((xc->readMiscReg(HprStart + MISCREG_HPSTATE))<2:2>)'''
|
||||
(header_output, decoder_output,
|
||||
exec_output, decode_block) = doPrivFormat(code,
|
||||
checkCode, name, Name, opt_flags)
|
||||
}};
|
||||
|
||||
def format HPriv(code, *opt_flags) {{
|
||||
checkCode = "((xc->readMiscReg(HprStart + MISCREG_HPSTATE))<2:2>)"
|
||||
(header_output, decoder_output,
|
||||
exec_output, decode_block) = doPrivFormat(code,
|
||||
checkCode, name, Name, opt_flags)
|
||||
}};
|
||||
|
||||
|
|
Loading…
Reference in a new issue