From 80b6ee312e8ee3b7ac303a7e178115fec03c5734 Mon Sep 17 00:00:00 2001 From: Peter Rugg Date: Tue, 7 Jan 2020 11:25:22 +0000 Subject: [PATCH] Fix address/addrBits out of sync bugs --- CHERICC_Fat.bsv | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHERICC_Fat.bsv b/CHERICC_Fat.bsv index a2077a9..d8efa5b 100644 --- a/CHERICC_Fat.bsv +++ b/CHERICC_Fat.bsv @@ -997,6 +997,7 @@ instance CHERICap #(CapReg, OTypeW, FlagsW, CapAddressW, CapW, TSub#(MW, 3)); function CapReg nullWithAddr (Bit#(CapAddressW) addr); CapReg res = nullCap; res.address = zeroExtend(addr); + res.addrBits = {2'b0, truncateLSB(addr)}; return res; endfunction @@ -1016,6 +1017,8 @@ instance CHERICap #(CapReg, OTypeW, FlagsW, CapAddressW, CapW, TSub#(MW, 3)); function CapReg maskAddr (CapReg cap, Bit#(TSub#(MW, 3)) mask); cap.address[valueOf(TSub#(MW, 4)):0] = cap.address[valueOf(TSub#(MW, 4)):0] & mask; + //Update addrBits. Since exp can be up to 64, extend to 64 + 8 bits so bit-select is always in range + cap.addrBits = (({40'b0,cap.address})[cap.bounds.exp+7:cap.bounds.exp]); //TODO avoid shift? return cap; endfunction