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