diff --git a/CHERICC_Fat.bsv b/CHERICC_Fat.bsv index 6d43db8..f140fd2 100644 --- a/CHERICC_Fat.bsv +++ b/CHERICC_Fat.bsv @@ -94,6 +94,7 @@ typedef Bit#(CapAddressW) CapAddress; // The Hardware permissions type typedef struct { Bool reserved; + Bool permit_set_CID; Bool acces_sys_regs; Bool permit_unseal; Bool permit_ccall; @@ -866,6 +867,7 @@ instance CHERICap #(CapPipe, 18, 64); function HardPerms getHardPerms (CapPipe cap); return HardPerms { + permitSetCID: cap.capFat.perms.hard.permit_set_CID, accessSysRegs: cap.capFat.perms.hard.acces_sys_regs, permitUnseal: cap.capFat.perms.hard.permit_unseal, permitCCall: cap.capFat.perms.hard.permit_ccall, @@ -883,6 +885,7 @@ instance CHERICap #(CapPipe, 18, 64); function CapPipe setHardPerms (CapPipe cap, HardPerms perms); cap.capFat.perms.hard = HPerms { reserved: ?, + permit_set_CID: perms.permitSetCID, acces_sys_regs: perms.accessSysRegs, permit_unseal: perms.accessSysRegs, permit_ccall: perms.accessSysRegs, diff --git a/CHERICap.bsv b/CHERICap.bsv index 21102e8..c156659 100644 --- a/CHERICap.bsv +++ b/CHERICap.bsv @@ -35,6 +35,7 @@ package CHERICap; typedef Bit#(16) SoftPerms; typedef struct { + Bool permitSetCID; Bool accessSysRegs; Bool permitUnseal; Bool permitCCall; @@ -95,7 +96,7 @@ typeclass CHERICap#(type t, numeric type ot, numeric type n) function t setSoftPerms (t cap, SoftPerms softperms); // Get the architectural permissions function Bit#(31) getPerms (t cap) = - zeroExtend({pack(getSoftPerms(cap)), 4'h0, pack(getHardPerms(cap))}); + zeroExtend({pack(getSoftPerms(cap)), 3'h0, pack(getHardPerms(cap))}); // Set the architectural permissions function t setPerms (t cap, Bit#(31) perms) = setSoftPerms(setHardPerms(cap, unpack(perms[11:0])), unpack(truncate(perms[30:15])));