From e74220afc4db602663a1eebc16ae62e27d3e0440 Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Tue, 19 May 2020 02:37:53 +0100 Subject: [PATCH] Implement CFromPtr --- src_Core/RISCY_OOO/procs/lib/CapChecks.bsvi | 1 + src_Core/RISCY_OOO/procs/lib/Decode.bsv | 40 +++++++++++---------- src_Core/RISCY_OOO/procs/lib/Exec.bsv | 13 ++++--- src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv | 8 ++--- 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src_Core/RISCY_OOO/procs/lib/CapChecks.bsvi b/src_Core/RISCY_OOO/procs/lib/CapChecks.bsvi index 22d733c..6577c6d 100644 --- a/src_Core/RISCY_OOO/procs/lib/CapChecks.bsvi +++ b/src_Core/RISCY_OOO/procs/lib/CapChecks.bsvi @@ -19,3 +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") diff --git a/src_Core/RISCY_OOO/procs/lib/Decode.bsv b/src_Core/RISCY_OOO/procs/lib/Decode.bsv index 92c9d07..4f922cf 100755 --- a/src_Core/RISCY_OOO/procs/lib/Decode.bsv +++ b/src_Core/RISCY_OOO/procs/lib/Decode.bsv @@ -1011,14 +1011,14 @@ function DecodeResult decode(Instruction inst, Bool cap_mode); dInst.capFunc = CapModify (ModifyOffset (SetOffset)); end f7_cap_CSetAddr: begin - dInst.capChecks.src1_unsealed = True; + dInst.capChecks.src2_unsealed = True; dInst.iType = Cap; regs.dst = Valid(tagged Gpr rd); - regs.src1 = Valid(tagged Gpr rs1); - regs.src2 = Valid(tagged Gpr rs2); + regs.src1 = Valid(tagged Gpr rs2); + regs.src2 = Valid(tagged Gpr rs1); dInst.imm = Invalid; - dInst.capFunc = CapModify (SetAddr (Src2Addr)); + dInst.capFunc = CapModify (SetAddr (Src1Addr)); end f7_cap_CIncOffset: begin dInst.capChecks.src1_unsealed = True; @@ -1120,21 +1120,21 @@ function DecodeResult decode(Instruction inst, Bool cap_mode); dInst.capFunc = CapInspect (TestSubset); end f7_cap_CCopyType: begin - dInst.capChecks.src1_tag = True; - dInst.capChecks.src1_unsealed = True; + dInst.capChecks.src2_tag = True; + dInst.capChecks.src2_unsealed = True; dInst.capChecks.check_enable = True; - dInst.capChecks.check_authority_src = Src1; - dInst.capChecks.check_low_src = Src2Type; - dInst.capChecks.check_high_src = Src2Type; + dInst.capChecks.check_authority_src = Src2; + dInst.capChecks.check_low_src = Src1Type; + dInst.capChecks.check_high_src = Src1Type; dInst.capChecks.check_inclusive = False; dInst.iType = Cap; regs.dst = Valid(tagged Gpr rd); - regs.src1 = Valid(tagged Gpr rs1); - regs.src2 = Valid(tagged Gpr rs2); + regs.src1 = Valid(tagged Gpr rs2); + regs.src2 = Valid(tagged Gpr rs1); dInst.imm = Invalid; - dInst.capFunc = CapModify (SetAddr (Src2Type)); + dInst.capFunc = CapModify (SetAddr (Src1Type)); end f7_cap_CAndPerm: begin dInst.capChecks.src1_tag = True; @@ -1175,17 +1175,19 @@ function DecodeResult decode(Instruction inst, Bool cap_mode); dInst.capFunc = CapInspect (ToPtr); end f7_cap_CFromPtr: begin - illegalInst = True; - //TODO these should only be checked when b non-zero - dInst.capChecks.src1_tag = True; - dInst.capChecks.src1_unsealed = True; + // Note these will get overridden if the contents of rs2 + // are zero in Exec + dInst.capChecks.src2_tag = True; + dInst.capChecks.src2_unsealed = True; + dInst.capChecks.skip_if_src1_zero = True; dInst.iType = Cap; regs.dst = Valid(tagged Gpr rd); - regs.src1 = Valid(tagged Gpr rs1); - regs.src2 = Valid(tagged Gpr rs2); + regs.src1 = Valid(tagged Gpr rs2); + regs.src2 = rs1 == 0 ? Invalid : Valid (tagged Gpr rs1); + dInst.scr = rs1 == 0 ? Valid(SCR_DDC) : Invalid; dInst.imm = Invalid; - dInst.capFunc = CapModify (SetAddr (Src2Addr)); + dInst.capFunc = CapModify (SetAddr (Src1Addr)); 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 dea225d..1b523ba 100755 --- a/src_Core/RISCY_OOO/procs/lib/Exec.bsv +++ b/src_Core/RISCY_OOO/procs/lib/Exec.bsv @@ -110,16 +110,16 @@ function Maybe#(BoundsCheck) prepareBoundsCheck(CapPipe a, CapPipe b, CapPipe pc case(toCheck.check_low_src) Src1Addr: ret.check_low = getAddr(a); Src1Base: ret.check_low = getBase(a); + Src1Type: ret.check_low = zeroExtend(getKind(a).SEALED_WITH_TYPE); Src2Addr: ret.check_low = getAddr(b); - Src2Type: ret.check_low = zeroExtend(getKind(b).SEALED_WITH_TYPE); Vaddr: ret.check_low = vaddr; endcase case(toCheck.check_high_src) Src1AddrPlus2: ret.check_high = {1'b0,getAddr(a)+2}; Src1Top: ret.check_high = getTop(a); + Src1Type: ret.check_high = zeroExtend(getKind(a).SEALED_WITH_TYPE); Src2Addr: ret.check_high = {1'b0,getAddr(b)}; - Src2Type: ret.check_high = zeroExtend(getKind(b).SEALED_WITH_TYPE); ResultTop: ret.check_high = {1'b0,getAddr(a)} + {1'b0,getAddr(b)}; VaddrPlusSize: ret.check_high = {1'b0,vaddr} + zeroExtend(size); endcase @@ -202,8 +202,8 @@ function CapPipe capModify(CapPipe a, CapPipe b, CapModifyFunc func); tagged EPC ._: nullWithAddr(getOffset(b)); endcase tagged SetAddr .addrSource : - if (addrSource == Src2Type && (getKind(b) == UNSEALED)) return nullWithAddr(-1); // TODO correct behaviour around reserved types - else return setAddr(a, (addrSource == Src2Type) ? zeroExtend(getKind(b).SEALED_WITH_TYPE) : getAddr(b) ).value; + 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; tagged Seal : setKind(a, SEALED_WITH_TYPE (truncate(getAddr(b)))); tagged Unseal .src : @@ -353,6 +353,11 @@ 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 + capException = Invalid; + cap_alu_result = nullCap; + end + cf.nextPc = setKind(cf.nextPc, UNSEALED); cf.mispredict = cf.nextPc != ppc; diff --git a/src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv b/src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv index 58aaeff..9f0c314 100755 --- a/src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv +++ b/src_Core/RISCY_OOO/procs/lib/ProcTypes.bsv @@ -264,7 +264,7 @@ typedef union tagged { } SpecialRWFunc deriving(Bits, Eq, FShow); typedef enum { - Src2Type, Src2Addr + Src1Type, Src1Addr } AddrSource deriving(Bits, Eq, FShow); typedef enum { @@ -521,17 +521,17 @@ typedef enum { typedef enum { Src1Addr, - Src2Addr, - Src2Type, Src1Base, + Src1Type, + Src2Addr, Vaddr // Memory Pipe } CheckLowSrc deriving(Bits, Eq, FShow); typedef enum { Src1AddrPlus2, Src1Top, + Src1Type, Src2Addr, - Src2Type, ResultTop, VaddrPlusSize // Memory Pipe } CheckHighSrc deriving(Bits, Eq, FShow);