Fix CFromPtr common case

This commit is contained in:
Peter Rugg
2020-05-19 23:04:53 +01:00
parent 372e4e4dfb
commit 61b97e090d
4 changed files with 9 additions and 12 deletions

View File

@@ -19,4 +19,4 @@
`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(skip_if_src1_zero,"skip_if_src1_zero")
`CAP_CHECK_FIELD(cfromptr_bypass,"cfromptr_bypass")

View File

@@ -1179,7 +1179,7 @@ function DecodeResult decode(Instruction inst, Bool cap_mode);
// are zero in Exec
dInst.capChecks.src2_tag = True;
dInst.capChecks.src2_unsealed = True;
dInst.capChecks.skip_if_src1_zero = True;
dInst.capChecks.cfromptr_bypass = True;
dInst.iType = Cap;
regs.dst = Valid(tagged Gpr rd);
@@ -1187,7 +1187,7 @@ function DecodeResult decode(Instruction inst, Bool cap_mode);
regs.src2 = rs1 == 0 ? Invalid : Valid (tagged Gpr rs1);
dInst.scr = rs1 == 0 ? Valid(SCR_DDC) : Invalid;
dInst.imm = Invalid;
dInst.capFunc = CapModify (SetAddr (Src1Addr));
dInst.capFunc = CapModify (FromPtr);
end
f7_cap_CSub: begin
// CSub is just a riscv subtract

View File

@@ -190,7 +190,7 @@ endfunction
function CapPipe capModify(CapPipe a, CapPipe b, CapModifyFunc func);
CapPipe res = (case(func) matches
tagged ModifyOffset .offsetOp :
modifyOffset(a, getAddr(b), offsetOp == IncOffset).value;
modifyOffset(a, getAddr(b), offsetOp == IncOffset).value; // TODO check for unrepresentability
tagged SetBounds .boundsOp :
setBoundsALU(a, getAddr(b), boundsOp);
tagged SpecialRW .scrType :
@@ -203,7 +203,7 @@ function CapPipe capModify(CapPipe a, CapPipe b, CapModifyFunc func);
endcase
tagged SetAddr .addrSource :
if (addrSource == Src1Type && (getKind(a) == UNSEALED)) return nullWithAddr(-1); // TODO correct behaviour around reserved types
else return setAddr(b, (addrSource == Src1Type) ? zeroExtend(getKind(a).SEALED_WITH_TYPE) : getAddr(a) ).value;
else return setAddr(b, (addrSource == Src1Type) ? zeroExtend(getKind(a).SEALED_WITH_TYPE) : getAddr(a) ).value; // TODO check for unrepresentability
tagged Seal :
setKind(a, SEALED_WITH_TYPE (truncate(getAddr(b))));
tagged Unseal .src :
@@ -212,16 +212,14 @@ function CapPipe capModify(CapPipe a, CapPipe b, CapModifyFunc func);
setPerms(a, pack(getPerms(a)) & truncate(getAddr(b)));
tagged SetFlags :
setFlags(a, truncate(getAddr(b)));
//tagged FromPtr :
// error("FromPtr not yet implemented");
tagged FromPtr :
(getAddr(a) == 0 ? nullCap : setOffset(b, getAddr(a)).value); // TODO check for unrepresentability
tagged BuildCap :
setKind(setValidCap(a, True),UNSEALED); // TODO preserve sentries
tagged Move :
a;
tagged ClearTag :
setValidCap(a, False);
//tagged CJALR :
// error("CJALR not yet implemented");
default: ?;
endcase);
return res;
@@ -353,9 +351,8 @@ function ExecResult basicExec(DecodedInst dInst, CapPipe rVal1, CapPipe rVal2, C
Maybe#(BoundsCheck) boundsCheck = prepareBoundsCheck(rVal1, aluVal2, pcc,
nullCap, 0, 0, // These three are only used in the memory pipe
dInst.capChecks);
if (dInst.capChecks.skip_if_src1_zero && getAddr(rVal1) == 0) begin
if (dInst.capChecks.cfromptr_bypass && getAddr(rVal1) == 0) begin
capException = Invalid;
cap_alu_result = nullCap;
end
cf.nextPc = setKind(cf.nextPc, UNSEALED);

View File

@@ -283,7 +283,7 @@ typedef union tagged {
void BuildCap;
void Move;
void ClearTag;
void CJALR;
void FromPtr;
} CapModifyFunc deriving(Bits, Eq, FShow);
typedef union tagged {