From 61b97e090df2d7c9ced5426bdd66321b75b86798 Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Tue, 19 May 2020 23:04:53 +0100 Subject: [PATCH] Fix CFromPtr common case --- src_Core/RISCY_OOO/procs/lib/CapChecks.bsvi | 2 +- src_Core/RISCY_OOO/procs/lib/Decode.bsv | 4 ++-- src_Core/RISCY_OOO/procs/lib/Exec.bsv | 13 +++++-------- src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv | 2 +- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src_Core/RISCY_OOO/procs/lib/CapChecks.bsvi b/src_Core/RISCY_OOO/procs/lib/CapChecks.bsvi index 6577c6d..981bbad 100644 --- a/src_Core/RISCY_OOO/procs/lib/CapChecks.bsvi +++ b/src_Core/RISCY_OOO/procs/lib/CapChecks.bsvi @@ -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") diff --git a/src_Core/RISCY_OOO/procs/lib/Decode.bsv b/src_Core/RISCY_OOO/procs/lib/Decode.bsv index 4f922cf..a157460 100755 --- a/src_Core/RISCY_OOO/procs/lib/Decode.bsv +++ b/src_Core/RISCY_OOO/procs/lib/Decode.bsv @@ -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 diff --git a/src_Core/RISCY_OOO/procs/lib/Exec.bsv b/src_Core/RISCY_OOO/procs/lib/Exec.bsv index 1b523ba..ed042a4 100755 --- a/src_Core/RISCY_OOO/procs/lib/Exec.bsv +++ b/src_Core/RISCY_OOO/procs/lib/Exec.bsv @@ -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); diff --git a/src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv b/src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv index 9f0c314..96bbf19 100755 --- a/src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv +++ b/src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv @@ -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 {