diff options
| author | Robert Norton | 2016-04-27 12:54:16 +0100 |
|---|---|---|
| committer | Robert Norton | 2016-04-27 12:54:16 +0100 |
| commit | 654e9fbc68f6e253af41e91bb91edeaba204a9b8 (patch) | |
| tree | 9c488ab4f44f68301bd64168bfcb4e8b09b2257c /cheri | |
| parent | d9f4c62a3e4ee6d74580a9168040b3dace7b384f (diff) | |
cheri: add translation and bounds checking of PC via PCC. Slightly clunky implementation for now and exceptions not properly handled.
Diffstat (limited to 'cheri')
| -rw-r--r-- | cheri/cheri_prelude.sail | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/cheri/cheri_prelude.sail b/cheri/cheri_prelude.sail index 5f98e857..1ae3fa77 100644 --- a/cheri/cheri_prelude.sail +++ b/cheri/cheri_prelude.sail @@ -26,6 +26,7 @@ typedef CapReg = register bits [256:0] { } register CapReg PCC +register CapReg nextPCC register CapReg delayedPCC register CapReg C00 (* aka default data capability, DDC *) register CapReg C01 @@ -385,3 +386,13 @@ function bit[64] addrWrapper((bit[64]) addr, (MemAccessType) accessType, (WordTy exit (raise_c2_exception(CapEx_LengthViolation, capno)); vAddr64; } + +function (option<Exception>, option<bit[64]>) TranslateAddress ((bit[64]) vAddr, (MemAccessType) accessType) = + let (bit[257]) x = PCC in + let (bit[64]) base = x[127..64] in + let (bit[64]) length = x[63..0] in + let (bit[64]) absPC = (base + vAddr) in + if ((unsigned(vAddr) + 4) > unsigned(length)) then + (Some(C2E), None) (* XXX take exception properly *) + else + TLBTranslate(absPC, accessType) |
