Implement CFromPtr
This commit is contained in:
@@ -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")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user