From ab6b8966dbb25fc1184ad6c818665f85004ccaa9 Mon Sep 17 00:00:00 2001 From: jon Date: Tue, 28 Apr 2020 11:47:09 +0100 Subject: [PATCH] Bounds-check legacy jalr and br correctly. --- src_Core/RISCY_OOO/procs/lib/Decode.bsv | 15 +++++++++++++++ src_Core/RISCY_OOO/procs/lib/Exec.bsv | 13 +++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src_Core/RISCY_OOO/procs/lib/Decode.bsv b/src_Core/RISCY_OOO/procs/lib/Decode.bsv index d339062..a534269 100755 --- a/src_Core/RISCY_OOO/procs/lib/Decode.bsv +++ b/src_Core/RISCY_OOO/procs/lib/Decode.bsv @@ -371,6 +371,11 @@ function DecodeResult decode(Instruction inst); dInst.imm = Valid(immJ); dInst.csr = tagged Invalid; dInst.execFunc = tagged Br AT; + dInst.capChecks.check_enable = True; + dInst.capChecks.check_authority_src = Src1; + dInst.capChecks.check_low_src = Src1Addr; + dInst.capChecks.check_high_src = Src1AddrPlus2; + dInst.capChecks.check_inclusive = False; end Jalr: begin @@ -381,6 +386,11 @@ function DecodeResult decode(Instruction inst); dInst.imm = Valid(immI); dInst.csr = tagged Invalid; dInst.execFunc = tagged Br AT; + dInst.capChecks.check_enable = True; + dInst.capChecks.check_authority_src = Src1; + dInst.capChecks.check_low_src = Src1Addr; + dInst.capChecks.check_high_src = Src1AddrPlus2; + dInst.capChecks.check_inclusive = False; end Branch: begin @@ -398,6 +408,11 @@ function DecodeResult decode(Instruction inst); regs.src2 = Valid(tagged Gpr rs2); dInst.imm = Valid(immB); dInst.csr = tagged Invalid; + dInst.capChecks.check_enable = True; + dInst.capChecks.check_authority_src = Src1; + dInst.capChecks.check_low_src = Src1Addr; + dInst.capChecks.check_high_src = Src1AddrPlus2; + dInst.capChecks.check_inclusive = False; end Load: begin diff --git a/src_Core/RISCY_OOO/procs/lib/Exec.bsv b/src_Core/RISCY_OOO/procs/lib/Exec.bsv index 8a3efe3..fd137a2 100755 --- a/src_Core/RISCY_OOO/procs/lib/Exec.bsv +++ b/src_Core/RISCY_OOO/procs/lib/Exec.bsv @@ -284,6 +284,13 @@ function ExecResult basicExec(DecodedInst dInst, CapPipe rVal1, CapPipe rVal2, C AluFunc alu_f = dInst.execFunc matches tagged Alu .alu_f ? alu_f : Add; Data alu_result = alu(getAddr(rVal1), getAddr(aluVal2), alu_f); + // Default branch function is not taken + BrFunc br_f = dInst.execFunc matches tagged Br .br_f ? br_f : NT; + cf.taken = aluBr(getAddr(rVal1), getAddr(rVal2), br_f); + cf.nextPc = brAddrCalc(pcc, rVal1, dInst.iType, fromMaybe(0,getDInstImm(dInst)), cf.taken, orig_inst, (ccall || cjalr)); + if (dInst.execFunc matches tagged Br .br_f) rVal1 = cf.nextPc; + cf.mispredict = cf.nextPc != ppc; + Data inspect_result = capInspect(rVal1, aluVal2, dInst.execFunc.CapInspect); CapModifyFunc modFunc = ccall ? (Unseal (Src2)):dInst.execFunc.CapModify; CapPipe modify_result = capModify(rVal1, aluVal2, modFunc); @@ -297,12 +304,6 @@ function ExecResult basicExec(DecodedInst dInst, CapPipe rVal1, CapPipe rVal2, C default: nullWithAddr(alu_result); endcase; - // Default branch function is not taken - BrFunc br_f = dInst.execFunc matches tagged Br .br_f ? br_f : NT; - cf.taken = aluBr(getAddr(rVal1), getAddr(rVal2), br_f); - cf.nextPc = brAddrCalc(pcc, rVal1, dInst.iType, fromMaybe(0,getDInstImm(dInst)), cf.taken, orig_inst, (ccall || cjalr)); - cf.mispredict = cf.nextPc != ppc; - data = (case (dInst.iType) matches St : rVal2; Sc : rVal2;