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