Report writes to PCC as illegal instruction, not ASR violation
This commit is contained in:
@@ -19,7 +19,6 @@
|
||||
`CAP_CHECK_FIELD(src1_type_not_reserved,"src1_type_not_reserved")
|
||||
`CAP_CHECK_FIELD(src1_perm_subset_src2,"src1_perm_subset_src2")
|
||||
`CAP_CHECK_FIELD(src1_derivable,"src1_derivable")
|
||||
`CAP_CHECK_FIELD(scr_read_only,"scr_read_only")
|
||||
`CAP_CHECK_FIELD(cfromptr_bypass,"cfromptr_bypass")
|
||||
`CAP_CHECK_FIELD(ccseal_bypass,"ccseal_bypass")
|
||||
`CAP_CHECK_FIELD(cap_exact,"cap_exact")
|
||||
|
||||
@@ -969,7 +969,6 @@ function DecodeResult decode(Instruction inst, Bool cap_mode);
|
||||
dInst.execFunc = tagged Alu Add;
|
||||
regs.src1 = Invalid;
|
||||
dInst.csr = tagged Invalid;
|
||||
dInst.capChecks.scr_read_only = True;
|
||||
end else begin
|
||||
dInst.scr = Valid (scr);
|
||||
end
|
||||
|
||||
@@ -92,8 +92,6 @@ function Maybe#(CSR_XCapCause) capChecksExec(CapPipe a, CapPipe b, CapPipe ddc,
|
||||
result = e2(SoftwarePermViolation);
|
||||
else if (toCheck.src1_derivable && !isDerivable(a))
|
||||
result = e1(LengthViolation);
|
||||
else if (toCheck.scr_read_only && (toCheck.rn1 != 0))
|
||||
result = Valid(CSR_XCapCause{cheri_exc_reg: {1,pack(SCR_PCC)}, cheri_exc_code: PermitASRViolation});
|
||||
else if (toCheck.cap_exact && !cap_exact)
|
||||
result = e1(RepresentViolation);
|
||||
return result;
|
||||
@@ -534,9 +532,12 @@ function Maybe#(Trap) checkForException(
|
||||
else if(dInst.scr matches tagged Valid .scr) begin
|
||||
Bool scr_has_priv = (prv >= pack(scr)[4:3]);
|
||||
Bool unimplemented = (scr == SCR_None);
|
||||
Bool writes_scr = regs.src1 == Valid (tagged Gpr 0) ? False : True;
|
||||
Bool read_only = (scr == SCR_PCC);
|
||||
Bool write_deny = (writes_scr && read_only);
|
||||
Bool asr_deny = !getHardPerms(pcc).accessSysRegs && !(
|
||||
scr == SCR_DDC);
|
||||
if(!scr_has_priv || unimplemented) begin // Writes to PCC checked in capChecks
|
||||
scr == SCR_DDC || scr == SCR_PCC);
|
||||
if(!scr_has_priv || unimplemented || write_deny) begin
|
||||
exception = Valid (Exception (IllegalInst));
|
||||
end else if (asr_deny) begin
|
||||
exception = Valid (CapException (CSR_XCapCause {cheri_exc_reg: {1'b1, pack(SCR_PCC)}, cheri_exc_code: PermitASRViolation}));
|
||||
|
||||
Reference in New Issue
Block a user