summaryrefslogtreecommitdiff
path: root/aarch64_small/armV8.h.sail
diff options
context:
space:
mode:
Diffstat (limited to 'aarch64_small/armV8.h.sail')
-rw-r--r--aarch64_small/armV8.h.sail196
1 files changed, 196 insertions, 0 deletions
diff --git a/aarch64_small/armV8.h.sail b/aarch64_small/armV8.h.sail
new file mode 100644
index 00000000..f5c5aa1e
--- /dev/null
+++ b/aarch64_small/armV8.h.sail
@@ -0,0 +1,196 @@
+/*========================================================================*/
+/* */
+/* Copyright (c) 2015-2017 Shaked Flur */
+/* Copyright (c) 2015-2017 Kathyrn Gray */
+/* All rights reserved. */
+/* */
+/* This software was developed by the University of Cambridge Computer */
+/* Laboratory as part of the Rigorous Engineering of Mainstream Systems */
+/* (REMS) project, funded by EPSRC grant EP/K008528/1. */
+/* */
+/* Redistribution and use in source and binary forms, with or without */
+/* modification, are permitted provided that the following conditions */
+/* are met: */
+/* 1. Redistributions of source code must retain the above copyright */
+/* notice, this list of conditions and the following disclaimer. */
+/* 2. Redistributions in binary form must reproduce the above copyright */
+/* notice, this list of conditions and the following disclaimer in */
+/* the documentation and/or other materials provided with the */
+/* distribution. */
+/* */
+/* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' */
+/* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */
+/* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A */
+/* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR */
+/* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
+/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT */
+/* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF */
+/* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND */
+/* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, */
+/* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
+/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF */
+/* SUCH DAMAGE. */
+/*========================================================================*/
+
+default Order dec
+
+type boolean = bit
+type integer = int
+type uinteger = nat /* ARM ARM does not have nat/uint type */
+type reg_size = bits(5)
+type reg_index = range(0,31)
+type SIMD_index = range(0,31)
+
+register _PC : bits(64)
+
+/* transactional memory registers */
+register TxNestingLevel : bits(8) /* same size as TXIDR_EL0.DEPTH */
+
+bitfield TMSTATUS_type : bits(64) =
+{
+ /*RES0 : 63..17,*/
+ IMP : 16,
+ DBG : 15,
+ MEM : 14,
+ ERR : 13,
+ INV : 12,
+ SIZE : 11,
+ NEST : 10,
+ ABRT : 9,
+ RTRY : 8,
+ /*7..5 : RES0*/
+ REASON : 4..0,
+}
+register TMAbortEffect : TMSTATUS_type /* we abuse the register write to pass out the status value */
+register TMStartEffect : TMSTATUS_type /* we abuse the register read to pass in the status value */
+
+/* General purpose registers */
+
+register R30 : bits(64)
+register R29 : bits(64)
+register R28 : bits(64)
+register R27 : bits(64)
+register R26 : bits(64)
+register R25 : bits(64)
+register R24 : bits(64)
+register R23 : bits(64)
+register R22 : bits(64)
+register R21 : bits(64)
+register R20 : bits(64)
+register R19 : bits(64)
+register R18 : bits(64)
+register R17 : bits(64)
+register R16 : bits(64)
+register R15 : bits(64)
+register R14 : bits(64)
+register R13 : bits(64)
+register R12 : bits(64)
+register R11 : bits(64)
+register R10 : bits(64)
+register R9 : bits(64)
+register R8 : bits(64)
+register R7 : bits(64)
+register R6 : bits(64)
+register R5 : bits(64)
+register R4 : bits(64)
+register R3 : bits(64)
+register R2 : bits(64)
+register R1 : bits(64)
+register R0 : bits(64)
+
+let _R : vector(32,dec,(register(bits(64)))) =
+ [undefined,R30,R29,R28,R27,R26,R25,R24,R23,R22,R21,
+ R20,R19,R18,R17,R16,R15,R14,R13,R12,R11,
+ R10,R9 ,R8 ,R7 ,R6 ,R5 ,R4 ,R3 ,R2 ,R1 ,
+ R0]
+
+val reg_index : reg_size -> UInt_reg effect pure
+function reg_index x = (x : (reg_index))
+
+/* SIMD and floating-point registers */
+
+register V31 : bits(128)
+register V30 : bits(128)
+register V29 : bits(128)
+register V28 : bits(128)
+register V27 : bits(128)
+register V26 : bits(128)
+register V25 : bits(128)
+register V24 : bits(128)
+register V23 : bits(128)
+register V22 : bits(128)
+register V21 : bits(128)
+register V20 : bits(128)
+register V19 : bits(128)
+register V18 : bits(128)
+register V17 : bits(128)
+register V16 : bits(128)
+register V15 : bits(128)
+register V14 : bits(128)
+register V13 : bits(128)
+register V12 : bits(128)
+register V11 : bits(128)
+register V10 : bits(128)
+register V9 : bits(128)
+register V8 : bits(128)
+register V7 : bits(128)
+register V6 : bits(128)
+register V5 : bits(128)
+register V4 : bits(128)
+register V3 : bits(128)
+register V2 : bits(128)
+register V1 : bits(128)
+register V0 : bits(128)
+
+let _V : vector(32,dec,(register(bits(128)))) =
+ [undefined,V31,V30,V29,V28,V27,V26,V25,V24,V23,V22,
+ V21,V20,V19,V18,V17,V16,V15,V14,V13,V12,
+ V11,V10,V9 ,V8 ,V7 ,V6 ,V5 ,V4 ,V3 ,V2 ,
+ V1 ,V0]
+
+
+/* lsl: used instead of the ARM ARM << over integers */
+val lsl : forall 'm 'n, 'm >= 0 & 'n >= 0. (atom('n), atom('m)) -> atom('n * (2 ^ 'm))
+function lsl (n, m) = n * (2 ^ m)
+
+/* not_implemented is used to indicate something WE did not implement */
+val not_implemented : string -> unit effect { escape }
+function not_implemented message = exit () /* TODO message */
+
+/* not_implemented_extern is used to indicate something ARM did not define
+ and we did not define yet either. Those functions used to be declared as
+ external but undefined there. */
+val not_implemented_extern : forall 'a. string -> 'a effect { escape }
+function not_implemented_extern (message) =
+ exit () /* message; TODO */
+
+/* info is used to convey information to the user */
+val info : string -> unit effect pure
+let info(message) = ()
+
+struct IMPLEMENTATION_DEFINED_type =
+{
+ HaveCRCExt : boolean,
+ HaveAArch32EL : boolean,
+ HaveAnyAArch32 : boolean,
+ HaveEL2 : boolean,
+ HaveEL3 : boolean,
+ HighestELUsingAArch32 : boolean,
+ IsSecureBelowEL3 : boolean,
+}
+let IMPLEMENTATION_DEFINED =
+{
+ HaveCRCExt = true;
+ HaveAArch32EL = false;
+ HaveAnyAArch32 = false;
+ HaveEL2 = false;
+ HaveEL3 = false;
+ HighestELUsingAArch32 = false;
+ IsSecureBelowEL3 = false;
+}
+
+/* FIXME: ask Kathy what should we do with this */
+let UNKNOWN = 0
+
+
+/* external */ val speculate_exclusive_success : unit -> bool effect {exmem}