|
|
1
|
+/*
|
|
|
2
|
+ * This code was written as part of the CMUCL project and has been
|
|
|
3
|
+ * placed in the public domain.
|
|
|
4
|
+ */
|
|
|
5
|
+#ifndef ARM64_LISPREGS_H
|
|
|
6
|
+#define ARM64_LISPREGS_H
|
|
|
7
|
+
|
|
|
8
|
+#ifdef LANGUAGE_ASSEMBLY
|
|
|
9
|
+#define REG(num) x ## num
|
|
|
10
|
+#else
|
|
|
11
|
+#define REG(num) (num)
|
|
|
12
|
+#endif
|
|
|
13
|
+
|
|
|
14
|
+#define NREGS 32
|
|
|
15
|
+
|
|
|
16
|
+/*
|
|
|
17
|
+ * Non-descriptor (C argument/scratch) registers: X0-X7.
|
|
|
18
|
+ * Caller-saved in both the C ABI and Lisp; hold raw untagged values.
|
|
|
19
|
+ */
|
|
|
20
|
+#define reg_NL0 REG(0) /* X0 - C arg 0 / return value */
|
|
|
21
|
+#define reg_NL1 REG(1) /* X1 - C arg 1 */
|
|
|
22
|
+#define reg_NL2 REG(2) /* X2 - C arg 2 */
|
|
|
23
|
+#define reg_NL3 REG(3) /* X3 - C arg 3 */
|
|
|
24
|
+#define reg_NL4 REG(4) /* X4 - C arg 4 */
|
|
|
25
|
+#define reg_NL5 REG(5) /* X5 - C arg 5 */
|
|
|
26
|
+#define reg_NL6 REG(6) /* X6 - C arg 6 */
|
|
|
27
|
+#define reg_NL7 REG(7) /* X7 - C arg 7 */
|
|
|
28
|
+
|
|
|
29
|
+/* Runtime state registers (non-descriptor range). */
|
|
|
30
|
+#define reg_NARGS REG(8) /* X8 - number of arguments */
|
|
|
31
|
+#define reg_CFUNC REG(9) /* X9 - C function address */
|
|
|
32
|
+#define reg_NFP REG(10) /* X10 - number-stack frame pointer */
|
|
|
33
|
+#define reg_BSP REG(11) /* X11 - binding stack pointer */
|
|
|
34
|
+#define reg_CFP REG(12) /* X12 - control frame pointer */
|
|
|
35
|
+#define reg_CSP REG(13) /* X13 - control stack pointer */
|
|
|
36
|
+#define reg_ALLOC REG(14) /* X14 - allocation pointer */
|
|
|
37
|
+#define reg_NULL REG(15) /* X15 - NIL / null register */
|
|
|
38
|
+
|
|
|
39
|
+/* Code and call-target registers. */
|
|
|
40
|
+#define reg_CODE REG(16) /* X16 - current code object (C: ip0) */
|
|
|
41
|
+#define reg_FDEFN REG(17) /* X17 - function definition (C: ip1) */
|
|
|
42
|
+
|
|
|
43
|
+/* Descriptor (Lisp object) registers. */
|
|
|
44
|
+#define reg_CNAME REG(18) /* X18 - called name */
|
|
|
45
|
+#define reg_LEXENV REG(19) /* X19 - lexical environment */
|
|
|
46
|
+#define reg_OCFP REG(20) /* X20 - old control frame pointer */
|
|
|
47
|
+#define reg_LRA REG(21) /* X21 - lisp return address */
|
|
|
48
|
+
|
|
|
49
|
+/* Argument registers (descriptor). */
|
|
|
50
|
+#define reg_A0 REG(22) /* X22 - argument 0 */
|
|
|
51
|
+#define reg_A1 REG(23) /* X23 - argument 1 */
|
|
|
52
|
+#define reg_A2 REG(24) /* X24 - argument 2 */
|
|
|
53
|
+#define reg_A3 REG(25) /* X25 - argument 3 */
|
|
|
54
|
+
|
|
|
55
|
+/* Local (descriptor) registers. */
|
|
|
56
|
+#define reg_L0 REG(26) /* X26 - local 0 */
|
|
|
57
|
+#define reg_L1 REG(27) /* X27 - local 1 */
|
|
|
58
|
+#define reg_L2 REG(28) /* X28 - local 2 */
|
|
|
59
|
+
|
|
|
60
|
+/* Interior pointer and ABI registers. */
|
|
|
61
|
+#define reg_LIP REG(29) /* X29 - lisp interior pointer (C ABI FP, reclaimed) */
|
|
|
62
|
+#define reg_LR REG(30) /* X30 - hardware link register */
|
|
|
63
|
+
|
|
|
64
|
+/*
|
|
|
65
|
+ * X31 is context-dependent in AArch64:
|
|
|
66
|
+ * - In data-processing encodings: XZR (zero register), reads as 0.
|
|
|
67
|
+ * - In load/store base and SP-arith: SP (stack pointer).
|
|
|
68
|
+ */
|
|
|
69
|
+#define reg_NSP REG(31) /* X31/SP - native stack pointer / zero register */
|
|
|
70
|
+
|
|
|
71
|
+#define REGNAMES \
|
|
|
72
|
+ "NL0", "NL1", "NL2", "NL3", "NL4", "NL5", "NL6", "NL7", \
|
|
|
73
|
+ "NARGS", "CFUNC", "NFP", "BSP", "CFP", "CSP", "ALLOC", "NULL", \
|
|
|
74
|
+ "CODE", "FDEFN", "CNAME", "LEXENV", "OCFP", "LRA", \
|
|
|
75
|
+ "A0", "A1", "A2", "A3", \
|
|
|
76
|
+ "L0", "L1", "L2", \
|
|
|
77
|
+ "LIP", "LR", "ZR/SP"
|
|
|
78
|
+
|
|
|
79
|
+#define BOXED_REGISTERS { \
|
|
|
80
|
+ reg_A0, reg_A1, reg_A2, reg_A3, \
|
|
|
81
|
+ reg_CNAME, reg_LEXENV, reg_OCFP, reg_LRA, reg_CODE, reg_FDEFN \
|
|
|
82
|
+}
|
|
|
83
|
+
|
|
|
84
|
+#define SC_REG(scp, reg) (*os_sigcontext_reg(scp, reg))
|
|
|
85
|
+#define SC_PC(scp) (*os_sigcontext_pc(scp))
|
|
|
86
|
+#define SC_SP(scp) SC_REG(scp, reg_CSP)
|
|
|
87
|
+
|
|
|
88
|
+#endif /* ARM64_LISPREGS_H */ |