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:
Gabe Black 2006-05-28 23:49:29 -04:00
parent a433cf140e
commit 981471c31d
2 changed files with 17 additions and 9 deletions

View file

@ -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>;

View file

@ -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)
}};