diff --git a/CHERICC_Fat.bsv b/CHERICC_Fat.bsv index 423df64..4175d96 100644 --- a/CHERICC_Fat.bsv +++ b/CHERICC_Fat.bsv @@ -904,7 +904,7 @@ instance CHERICap #(CapMem, OTypeW, FlagsW, CapAddressW, CapW, TSub#(MW, 3)); function setBoundsCombined = error("feature not implemented for this cap type"); function nullWithAddr = error("feature not implemented for this cap type"); function almightyCap = error("feature not implemented for this cap type"); - function nullCap = error("feature not implemented for this cap type"); + function nullCapFromDummy = error("feature not implemented for this cap type"); function validAsType = error("feature not implemented for this cap type"); function fromMem = error("feature not implemented for this cap type"); function toMem = error("feature not implemented for this cap type"); @@ -1030,7 +1030,7 @@ instance CHERICap #(CapReg, OTypeW, FlagsW, CapAddressW, CapW, TSub#(MW, 3)); function almightyCap = defaultCapFat; - function nullCap = null_cap; + function nullCapFromDummy (x) = null_cap; function Bool validAsType (CapReg dummy, Bit#(CapAddressW) checkType); UInt#(CapAddressW) checkTypeUnsigned = unpack(checkType); @@ -1120,7 +1120,7 @@ instance CHERICap #(CapPipe, OTypeW, FlagsW, CapAddressW, CapW, TSub#(MW, 3)); return CapPipe {capFat: res, tempFields: getTempFields(res)}; endfunction - function nullCap; + function nullCapFromDummy (x); CapReg res = nullCap; return CapPipe {capFat: res, tempFields: getTempFields(res)}; endfunction diff --git a/CHERICap.bsv b/CHERICap.bsv index e5857f8..9fc9981 100644 --- a/CHERICap.bsv +++ b/CHERICap.bsv @@ -170,10 +170,13 @@ typeclass CHERICap#(type t, numeric type ot, numeric type flg, numeric type n, n // Returns a null cap with an address set to the argument function t nullWithAddr (Bit#(n) addr); + // Workaround to allow null cap to be derived in default implementations + function t nullCapFromDummy(t dummy); + // Return the maximally permissive capability (initial register state) function t almightyCap; // Return the null capability - function t nullCap; + function t nullCap = nullCapFromDummy(?); // Check if a type is valid function Bool validAsType (t dummy, Bit#(n) checkType); @@ -196,12 +199,12 @@ typeclass CHERICap#(type t, numeric type ot, numeric type flg, numeric type n, n // TODO the following do not compile due to "not enough explicit type information" // Get representable alignment mask - // function Bit#(n) getRepresentableAlignmentMask (t dummy, Bit#(n) length_request) = - // setBoundsCombined(nullCap, length_request).mask; + function Bit#(n) getRepresentableAlignmentMask (t dummy, Bit#(n) length_request) = + setBoundsCombined(nullCapFromDummy(dummy), length_request).mask; // Get representable length - // function Bit#(n) getRepresentableLength (t dummy, Bit#(n) length_request) = - // setBoundsCombined(nullCap, length_request).length; + function Bit#(n) getRepresentableLength (t dummy, Bit#(n) length_request) = + setBoundsCombined(nullCapFromDummy(dummy), length_request).length; // Assert that the encoding is valid function Bool isDerivable (t cap);