1 /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2 /* 3 * Register definitions for the Hexagon architecture 4 */ 5 6 7 #ifndef _ASM_REGISTERS_H 8 #define _ASM_REGISTERS_H 9 10 #ifndef __ASSEMBLY__ 11 12 /* See kernel/entry.S for further documentation. */ 13 14 /* 15 * Entry code copies the event record out of guest registers into 16 * this structure (which is on the stack). 17 */ 18 19 struct hvm_event_record { 20 unsigned long vmel; /* Event Linkage (return address) */ 21 unsigned long vmest; /* Event context - pre-event SSR values */ 22 unsigned long vmpsp; /* Previous stack pointer */ 23 unsigned long vmbadva; /* Bad virtual address for addressing events */ 24 }; 25 26 struct pt_regs { 27 long restart_r0; /* R0 checkpoint for syscall restart */ 28 long syscall_nr; /* Only used in system calls */ 29 union { 30 struct { 31 unsigned long usr; 32 unsigned long preds; 33 }; 34 long long int predsusr; 35 }; 36 union { 37 struct { 38 unsigned long m0; 39 unsigned long m1; 40 }; 41 long long int m1m0; 42 }; 43 union { 44 struct { 45 unsigned long sa1; 46 unsigned long lc1; 47 }; 48 long long int lc1sa1; 49 }; 50 union { 51 struct { 52 unsigned long sa0; 53 unsigned long lc0; 54 }; 55 long long int lc0sa0; 56 }; 57 union { 58 struct { 59 unsigned long ugp; 60 unsigned long gp; 61 }; 62 long long int gpugp; 63 }; 64 union { 65 struct { 66 unsigned long cs0; 67 unsigned long cs1; 68 }; 69 long long int cs1cs0; 70 }; 71 /* 72 * Be extremely careful with rearranging these, if at all. Some code 73 * assumes the 32 registers exist exactly like this in memory; 74 * e.g. kernel/ptrace.c 75 * e.g. kernel/signal.c (restore_sigcontext) 76 */ 77 union { 78 struct { 79 unsigned long r00; 80 unsigned long r01; 81 }; 82 long long int r0100; 83 }; 84 union { 85 struct { 86 unsigned long r02; 87 unsigned long r03; 88 }; 89 long long int r0302; 90 }; 91 union { 92 struct { 93 unsigned long r04; 94 unsigned long r05; 95 }; 96 long long int r0504; 97 }; 98 union { 99 struct { 100 unsigned long r06; 101 unsigned long r07; 102 }; 103 long long int r0706; 104 }; 105 union { 106 struct { 107 unsigned long r08; 108 unsigned long r09; 109 }; 110 long long int r0908; 111 }; 112 union { 113 struct { 114 unsigned long r10; 115 unsigned long r11; 116 }; 117 long long int r1110; 118 }; 119 union { 120 struct { 121 unsigned long r12; 122 unsigned long r13; 123 }; 124 long long int r1312; 125 }; 126 union { 127 struct { 128 unsigned long r14; 129 unsigned long r15; 130 }; 131 long long int r1514; 132 }; 133 union { 134 struct { 135 unsigned long r16; 136 unsigned long r17; 137 }; 138 long long int r1716; 139 }; 140 union { 141 struct { 142 unsigned long r18; 143 unsigned long r19; 144 }; 145 long long int r1918; 146 }; 147 union { 148 struct { 149 unsigned long r20; 150 unsigned long r21; 151 }; 152 long long int r2120; 153 }; 154 union { 155 struct { 156 unsigned long r22; 157 unsigned long r23; 158 }; 159 long long int r2322; 160 }; 161 union { 162 struct { 163 unsigned long r24; 164 unsigned long r25; 165 }; 166 long long int r2524; 167 }; 168 union { 169 struct { 170 unsigned long r26; 171 unsigned long r27; 172 }; 173 long long int r2726; 174 }; 175 union { 176 struct { 177 unsigned long r28; 178 unsigned long r29; 179 }; 180 long long int r2928; 181 }; 182 union { 183 struct { 184 unsigned long r30; 185 unsigned long r31; 186 }; 187 long long int r3130; 188 }; 189 /* VM dispatch pushes event record onto stack - we can build on it */ 190 struct hvm_event_record hvmer; 191 }; 192 193 /* Defines to conveniently access the values */ 194 195 /* 196 * As of the VM spec 0.5, these registers are now set/retrieved via a 197 * VM call. On the in-bound side, we just fetch the values 198 * at the entry points and stuff them into the old record in pt_regs. 199 * However, on the outbound side, probably at VM rte, we set the 200 * registers back. 201 */ 202 203 #define pt_elr(regs) ((regs)->hvmer.vmel) 204 #define pt_set_elr(regs, val) ((regs)->hvmer.vmel = (val)) 205 #define pt_cause(regs) ((regs)->hvmer.vmest & (HVM_VMEST_CAUSE_MSK)) 206 #define user_mode(regs) \ 207 (((regs)->hvmer.vmest & (HVM_VMEST_UM_MSK << HVM_VMEST_UM_SFT)) != 0) 208 #define ints_enabled(regs) \ 209 (((regs)->hvmer.vmest & (HVM_VMEST_IE_MSK << HVM_VMEST_IE_SFT)) != 0) 210 #define pt_psp(regs) ((regs)->hvmer.vmpsp) 211 #define pt_badva(regs) ((regs)->hvmer.vmbadva) 212 213 #define pt_set_singlestep(regs) ((regs)->hvmer.vmest |= (1<<HVM_VMEST_SS_SFT)) 214 #define pt_clr_singlestep(regs) ((regs)->hvmer.vmest &= ~(1<<HVM_VMEST_SS_SFT)) 215 216 #define pt_set_rte_sp(regs, sp) do {\ 217 pt_psp(regs) = (regs)->r29 = (sp);\ 218 } while (0) 219 220 #define pt_set_kmode(regs) \ 221 (regs)->hvmer.vmest = (HVM_VMEST_IE_MSK << HVM_VMEST_IE_SFT) 222 223 #define pt_set_usermode(regs) \ 224 (regs)->hvmer.vmest = (HVM_VMEST_UM_MSK << HVM_VMEST_UM_SFT) \ 225 | (HVM_VMEST_IE_MSK << HVM_VMEST_IE_SFT) 226 227 #endif /* ifndef __ASSEMBLY */ 228 229 #endif 230