summaryrefslogtreecommitdiff
path: root/cheri
diff options
context:
space:
mode:
authorRobert Norton2017-01-26 13:59:36 +0000
committerRobert Norton2017-01-26 13:59:52 +0000
commitd761de19d1b6194f1f7a86cb4fbf1a549d252a1e (patch)
treeae00eec93159ddb0568665fc80b9c0a094f962b7 /cheri
parentedfa323d992916541bbaa0d25a0088d60ee7288f (diff)
c128: xor E with 48 when storing in memory so that null cap is all zeros but has non-zero E (latest spec.)
Diffstat (limited to 'cheri')
-rw-r--r--cheri/cheri_prelude_128.sail10
-rw-r--r--cheri/cheri_prelude_common.sail8
2 files changed, 11 insertions, 7 deletions
diff --git a/cheri/cheri_prelude_128.sail b/cheri/cheri_prelude_128.sail
index a96949a5..348bfc43 100644
--- a/cheri/cheri_prelude_128.sail
+++ b/cheri/cheri_prelude_128.sail
@@ -105,7 +105,7 @@ function CapStruct capRegToCapStruct((CapReg) c) =
permit_execute = c[114];
global = c[113];
reserved = c[112..111];
- E = c[110..105];
+ E = c[110..105] ^ 0b110000;
sealed = s;
B = B;
T = T;
@@ -132,7 +132,7 @@ function (bit[128]) capStructToMemBits((CapStruct) cap) =
( cap.uperms
: getCapHardPerms(cap)
: cap.reserved
- : cap.E
+ : (cap.E ^ 0b110000) (* XXX brackets required otherwise sail interpreter error *)
: [cap.sealed]
: b
: t
@@ -155,7 +155,7 @@ function (bit[31]) getCapPerms((CapStruct) cap) =
function CapStruct setCapPerms((CapStruct) cap, (bit[31]) perms) =
{ cap with
uperms = perms[18..15];
-(* perm_reserved11_14 = (cap.perm_reserved11_14 & (perms[14..11]));*)
+ (* 14..11 reserved -- ignore *)
access_system_regs = perms[10];
perm_reserved9 = perms[9];
perm_reserved8 = perms[8];
@@ -184,7 +184,7 @@ function int a_top_correction((bit[20]) a_mid, (bit[20]) R, (bit[20]) bound) =
}
function bit[64] getCapBase((CapStruct) c) =
- let ([|63|]) E = unsigned(c.E) in
+ let ([|63|]) E = min(unsigned(c.E), 45) in
let (bool) s = c.sealed in
let (bit[20]) B = c.B in
let (bit[64]) a = c.address in
@@ -196,7 +196,7 @@ function bit[64] getCapBase((CapStruct) c) =
base << E
function bit[65] getCapTop((CapStruct) c) =
- let ([|63|]) E = unsigned(c.E) in
+ let ([|63|]) E = min(unsigned(c.E), 45) in
let (bool) s = c.sealed in
let (bit[20]) B = c.B in
let (bit[20]) T = c.T in
diff --git a/cheri/cheri_prelude_common.sail b/cheri/cheri_prelude_common.sail
index 7530c9cc..5d88c43a 100644
--- a/cheri/cheri_prelude_common.sail
+++ b/cheri/cheri_prelude_common.sail
@@ -171,9 +171,13 @@ register CapCauseReg CapCause
function forall Type 'o . 'o SignalException ((Exception) ex) =
{
+ let pc = (bit[64]) PC in (* XXX Cast forces read of register. Sail bug? *)
let pcc = capRegToCapStruct(PCC) in
- let (success, epcc) = setCapOffset(pcc, PC) in
- C31 := capStructToCapReg(epcc);
+ let (success, epcc) = setCapOffset(pcc, pc) in
+ if (success) then
+ C31 := capStructToCapReg(epcc)
+ else
+ C31 := capStructToCapReg(int_to_cap(pc));
(* XXX what if not success? *)
nextPCC := C29; (* KCC *)
delayedPCC := C29; (* always write delayedPCC together whether PCC so