root/arch/hexagon/include/uapi/asm/registers.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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

/* [<][>][^][v][top][bottom][index][help] */