summaryrefslogtreecommitdiff
path: root/cheri
diff options
context:
space:
mode:
authorRobert Norton2016-04-15 14:08:32 +0100
committerRobert Norton2016-04-15 14:08:35 +0100
commit7e9524cb70edd40c7968667a6de12f09f6cfe29c (patch)
tree708146406337d50845e1312ccf57a19c0d2eb4c0 /cheri
parenta2f4234ae03c80089cc25955f61f189a40ab33c2 (diff)
cheri: explicitly zero extend regno when writing to cap cause because implicit cast does not work as expected (appends zeros at bottom).
Diffstat (limited to 'cheri')
-rw-r--r--cheri/cheri_prelude.sail11
1 files changed, 7 insertions, 4 deletions
diff --git a/cheri/cheri_prelude.sail b/cheri/cheri_prelude.sail
index 527cf2c5..78bf019f 100644
--- a/cheri/cheri_prelude.sail
+++ b/cheri/cheri_prelude.sail
@@ -278,15 +278,18 @@ typedef CapCauseReg = register bits [15:0] {
register CapCauseReg CapCause
-function unit raise_c2_exception((CapEx) capEx, (bit[8]) regnum) =
+function unit raise_c2_exception8((CapEx) capEx, (bit[8]) regnum) =
{
(CapCause.ExcCode) := CapExCode(capEx);
(CapCause.RegNum) := regnum;
SignalException(C2E);
}
-function unit raise_c2_exception_v((bit[8]) regnum) =
- switch(regnum[4..0]) {
+function unit raise_c2_exception((CapEx) capEx, (regno) regnum) =
+ raise_c2_exception8(capEx, 0b000 : regnum)
+
+function unit raise_c2_exception_v((regno) regnum) =
+ switch(regnum) {
case 0b11011 -> raise_c2_exception(CapEx_AccessKR1CViolation, regnum)
case 0b11100 -> raise_c2_exception(CapEx_AccessKR2CViolation, regnum)
case 0b11101 -> raise_c2_exception(CapEx_AccessKCCViolation, regnum)
@@ -296,7 +299,7 @@ function unit raise_c2_exception_v((bit[8]) regnum) =
}
function unit raise_c2_exception_noreg((CapEx) capEx) =
- raise_c2_exception(capEx, 0xff)
+ raise_c2_exception8(capEx, 0xff)
function bool register_inaccessible((regno) r) =
~(switch(r) {