Implement CFromPtr

This commit is contained in:
Peter Rugg
2020-05-19 02:37:53 +01:00
parent cd4d296a0c
commit e74220afc4
4 changed files with 35 additions and 27 deletions

View File

@@ -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")

View File

@@ -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

View File

@@ -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;

View File

@@ -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);