linux/arch/hexagon/include/uapi/asm/registers.h
<<
>>
Prefs
   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
  19struct 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
  26struct 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