1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __ASM_SPARC64_ELF_H 3*4882a593Smuzhiyun #define __ASM_SPARC64_ELF_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun /* 6*4882a593Smuzhiyun * ELF register definitions.. 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <asm/ptrace.h> 10*4882a593Smuzhiyun #include <asm/processor.h> 11*4882a593Smuzhiyun #include <asm/extable_64.h> 12*4882a593Smuzhiyun #include <asm/spitfire.h> 13*4882a593Smuzhiyun #include <asm/adi.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun /* 16*4882a593Smuzhiyun * Sparc section types 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun #define STT_REGISTER 13 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun /* 21*4882a593Smuzhiyun * Sparc ELF relocation types 22*4882a593Smuzhiyun */ 23*4882a593Smuzhiyun #define R_SPARC_NONE 0 24*4882a593Smuzhiyun #define R_SPARC_8 1 25*4882a593Smuzhiyun #define R_SPARC_16 2 26*4882a593Smuzhiyun #define R_SPARC_32 3 27*4882a593Smuzhiyun #define R_SPARC_DISP8 4 28*4882a593Smuzhiyun #define R_SPARC_DISP16 5 29*4882a593Smuzhiyun #define R_SPARC_DISP32 6 30*4882a593Smuzhiyun #define R_SPARC_WDISP30 7 31*4882a593Smuzhiyun #define R_SPARC_WDISP22 8 32*4882a593Smuzhiyun #define R_SPARC_HI22 9 33*4882a593Smuzhiyun #define R_SPARC_22 10 34*4882a593Smuzhiyun #define R_SPARC_13 11 35*4882a593Smuzhiyun #define R_SPARC_LO10 12 36*4882a593Smuzhiyun #define R_SPARC_GOT10 13 37*4882a593Smuzhiyun #define R_SPARC_GOT13 14 38*4882a593Smuzhiyun #define R_SPARC_GOT22 15 39*4882a593Smuzhiyun #define R_SPARC_PC10 16 40*4882a593Smuzhiyun #define R_SPARC_PC22 17 41*4882a593Smuzhiyun #define R_SPARC_WPLT30 18 42*4882a593Smuzhiyun #define R_SPARC_COPY 19 43*4882a593Smuzhiyun #define R_SPARC_GLOB_DAT 20 44*4882a593Smuzhiyun #define R_SPARC_JMP_SLOT 21 45*4882a593Smuzhiyun #define R_SPARC_RELATIVE 22 46*4882a593Smuzhiyun #define R_SPARC_UA32 23 47*4882a593Smuzhiyun #define R_SPARC_PLT32 24 48*4882a593Smuzhiyun #define R_SPARC_HIPLT22 25 49*4882a593Smuzhiyun #define R_SPARC_LOPLT10 26 50*4882a593Smuzhiyun #define R_SPARC_PCPLT32 27 51*4882a593Smuzhiyun #define R_SPARC_PCPLT22 28 52*4882a593Smuzhiyun #define R_SPARC_PCPLT10 29 53*4882a593Smuzhiyun #define R_SPARC_10 30 54*4882a593Smuzhiyun #define R_SPARC_11 31 55*4882a593Smuzhiyun #define R_SPARC_64 32 56*4882a593Smuzhiyun #define R_SPARC_OLO10 33 57*4882a593Smuzhiyun #define R_SPARC_WDISP16 40 58*4882a593Smuzhiyun #define R_SPARC_WDISP19 41 59*4882a593Smuzhiyun #define R_SPARC_7 43 60*4882a593Smuzhiyun #define R_SPARC_5 44 61*4882a593Smuzhiyun #define R_SPARC_6 45 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* Bits present in AT_HWCAP, primarily for Sparc32. */ 64*4882a593Smuzhiyun #define HWCAP_SPARC_FLUSH 0x00000001 65*4882a593Smuzhiyun #define HWCAP_SPARC_STBAR 0x00000002 66*4882a593Smuzhiyun #define HWCAP_SPARC_SWAP 0x00000004 67*4882a593Smuzhiyun #define HWCAP_SPARC_MULDIV 0x00000008 68*4882a593Smuzhiyun #define HWCAP_SPARC_V9 0x00000010 69*4882a593Smuzhiyun #define HWCAP_SPARC_ULTRA3 0x00000020 70*4882a593Smuzhiyun #define HWCAP_SPARC_BLKINIT 0x00000040 71*4882a593Smuzhiyun #define HWCAP_SPARC_N2 0x00000080 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* Solaris compatible AT_HWCAP bits. */ 74*4882a593Smuzhiyun #define AV_SPARC_MUL32 0x00000100 /* 32x32 multiply is efficient */ 75*4882a593Smuzhiyun #define AV_SPARC_DIV32 0x00000200 /* 32x32 divide is efficient */ 76*4882a593Smuzhiyun #define AV_SPARC_FSMULD 0x00000400 /* 'fsmuld' is efficient */ 77*4882a593Smuzhiyun #define AV_SPARC_V8PLUS 0x00000800 /* v9 insn available to 32bit */ 78*4882a593Smuzhiyun #define AV_SPARC_POPC 0x00001000 /* 'popc' is efficient */ 79*4882a593Smuzhiyun #define AV_SPARC_VIS 0x00002000 /* VIS insns available */ 80*4882a593Smuzhiyun #define AV_SPARC_VIS2 0x00004000 /* VIS2 insns available */ 81*4882a593Smuzhiyun #define AV_SPARC_ASI_BLK_INIT 0x00008000 /* block init ASIs available */ 82*4882a593Smuzhiyun #define AV_SPARC_FMAF 0x00010000 /* fused multiply-add */ 83*4882a593Smuzhiyun #define AV_SPARC_VIS3 0x00020000 /* VIS3 insns available */ 84*4882a593Smuzhiyun #define AV_SPARC_HPC 0x00040000 /* HPC insns available */ 85*4882a593Smuzhiyun #define AV_SPARC_RANDOM 0x00080000 /* 'random' insn available */ 86*4882a593Smuzhiyun #define AV_SPARC_TRANS 0x00100000 /* transaction insns available */ 87*4882a593Smuzhiyun #define AV_SPARC_FJFMAU 0x00200000 /* unfused multiply-add */ 88*4882a593Smuzhiyun #define AV_SPARC_IMA 0x00400000 /* integer multiply-add */ 89*4882a593Smuzhiyun #define AV_SPARC_ASI_CACHE_SPARING \ 90*4882a593Smuzhiyun 0x00800000 /* cache sparing ASIs available */ 91*4882a593Smuzhiyun #define AV_SPARC_PAUSE 0x01000000 /* PAUSE available */ 92*4882a593Smuzhiyun #define AV_SPARC_CBCOND 0x02000000 /* CBCOND insns available */ 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun /* Solaris decided to enumerate every single crypto instruction type 95*4882a593Smuzhiyun * in the AT_HWCAP bits. This is wasteful, since if crypto is present, 96*4882a593Smuzhiyun * you still need to look in the CFR register to see if the opcode is 97*4882a593Smuzhiyun * really available. So we simply advertise only "crypto" support. 98*4882a593Smuzhiyun */ 99*4882a593Smuzhiyun #define HWCAP_SPARC_CRYPTO 0x04000000 /* CRYPTO insns available */ 100*4882a593Smuzhiyun #define HWCAP_SPARC_ADI 0x08000000 /* ADI available */ 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun #define CORE_DUMP_USE_REGSET 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun /* 105*4882a593Smuzhiyun * These are used to set parameters in the core dumps. 106*4882a593Smuzhiyun */ 107*4882a593Smuzhiyun #define ELF_ARCH EM_SPARCV9 108*4882a593Smuzhiyun #define ELF_CLASS ELFCLASS64 109*4882a593Smuzhiyun #define ELF_DATA ELFDATA2MSB 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun /* Format of 64-bit elf_gregset_t is: 112*4882a593Smuzhiyun * G0 --> G7 113*4882a593Smuzhiyun * O0 --> O7 114*4882a593Smuzhiyun * L0 --> L7 115*4882a593Smuzhiyun * I0 --> I7 116*4882a593Smuzhiyun * TSTATE 117*4882a593Smuzhiyun * TPC 118*4882a593Smuzhiyun * TNPC 119*4882a593Smuzhiyun * Y 120*4882a593Smuzhiyun */ 121*4882a593Smuzhiyun typedef unsigned long elf_greg_t; 122*4882a593Smuzhiyun #define ELF_NGREG 36 123*4882a593Smuzhiyun typedef elf_greg_t elf_gregset_t[ELF_NGREG]; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun typedef struct { 126*4882a593Smuzhiyun unsigned long pr_regs[32]; 127*4882a593Smuzhiyun unsigned long pr_fsr; 128*4882a593Smuzhiyun unsigned long pr_gsr; 129*4882a593Smuzhiyun unsigned long pr_fprs; 130*4882a593Smuzhiyun } elf_fpregset_t; 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun /* Format of 32-bit elf_gregset_t is: 133*4882a593Smuzhiyun * G0 --> G7 134*4882a593Smuzhiyun * O0 --> O7 135*4882a593Smuzhiyun * L0 --> L7 136*4882a593Smuzhiyun * I0 --> I7 137*4882a593Smuzhiyun * PSR, PC, nPC, Y, WIM, TBR 138*4882a593Smuzhiyun */ 139*4882a593Smuzhiyun typedef unsigned int compat_elf_greg_t; 140*4882a593Smuzhiyun #define COMPAT_ELF_NGREG 38 141*4882a593Smuzhiyun typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG]; 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun typedef struct { 144*4882a593Smuzhiyun union { 145*4882a593Smuzhiyun unsigned int pr_regs[32]; 146*4882a593Smuzhiyun unsigned long pr_dregs[16]; 147*4882a593Smuzhiyun } pr_fr; 148*4882a593Smuzhiyun unsigned int __unused; 149*4882a593Smuzhiyun unsigned int pr_fsr; 150*4882a593Smuzhiyun unsigned char pr_qcnt; 151*4882a593Smuzhiyun unsigned char pr_q_entrysize; 152*4882a593Smuzhiyun unsigned char pr_en; 153*4882a593Smuzhiyun unsigned int pr_q[64]; 154*4882a593Smuzhiyun } compat_elf_fpregset_t; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* UltraSparc extensions. Still unused, but will be eventually. */ 157*4882a593Smuzhiyun typedef struct { 158*4882a593Smuzhiyun unsigned int pr_type; 159*4882a593Smuzhiyun unsigned int pr_align; 160*4882a593Smuzhiyun union { 161*4882a593Smuzhiyun struct { 162*4882a593Smuzhiyun union { 163*4882a593Smuzhiyun unsigned int pr_regs[32]; 164*4882a593Smuzhiyun unsigned long pr_dregs[16]; 165*4882a593Smuzhiyun long double pr_qregs[8]; 166*4882a593Smuzhiyun } pr_xfr; 167*4882a593Smuzhiyun } pr_v8p; 168*4882a593Smuzhiyun unsigned int pr_xfsr; 169*4882a593Smuzhiyun unsigned int pr_fprs; 170*4882a593Smuzhiyun unsigned int pr_xg[8]; 171*4882a593Smuzhiyun unsigned int pr_xo[8]; 172*4882a593Smuzhiyun unsigned long pr_tstate; 173*4882a593Smuzhiyun unsigned int pr_filler[8]; 174*4882a593Smuzhiyun } pr_un; 175*4882a593Smuzhiyun } elf_xregset_t; 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun /* 178*4882a593Smuzhiyun * This is used to ensure we don't load something for the wrong architecture. 179*4882a593Smuzhiyun */ 180*4882a593Smuzhiyun #define elf_check_arch(x) ((x)->e_machine == ELF_ARCH) 181*4882a593Smuzhiyun #define compat_elf_check_arch(x) ((x)->e_machine == EM_SPARC || \ 182*4882a593Smuzhiyun (x)->e_machine == EM_SPARC32PLUS) 183*4882a593Smuzhiyun #define compat_start_thread start_thread32 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun #define ELF_EXEC_PAGESIZE PAGE_SIZE 186*4882a593Smuzhiyun 187*4882a593Smuzhiyun /* This is the location that an ET_DYN program is loaded if exec'ed. Typical 188*4882a593Smuzhiyun use of this is to invoke "./ld.so someprog" to test out a new version of 189*4882a593Smuzhiyun the loader. We need to make sure that it is out of the way of the program 190*4882a593Smuzhiyun that it will "exec", and that there is sufficient room for the brk. */ 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun #define ELF_ET_DYN_BASE 0x0000010000000000UL 193*4882a593Smuzhiyun #define COMPAT_ELF_ET_DYN_BASE 0x0000000070000000UL 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun extern unsigned long sparc64_elf_hwcap; 196*4882a593Smuzhiyun #define ELF_HWCAP sparc64_elf_hwcap 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun /* This yields a string that ld.so will use to load implementation 199*4882a593Smuzhiyun specific libraries for optimization. This is more specific in 200*4882a593Smuzhiyun intent than poking at uname or /proc/cpuinfo. */ 201*4882a593Smuzhiyun 202*4882a593Smuzhiyun #define ELF_PLATFORM (NULL) 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun #define SET_PERSONALITY(ex) \ 205*4882a593Smuzhiyun do { if ((ex).e_ident[EI_CLASS] == ELFCLASS32) \ 206*4882a593Smuzhiyun set_thread_flag(TIF_32BIT); \ 207*4882a593Smuzhiyun else \ 208*4882a593Smuzhiyun clear_thread_flag(TIF_32BIT); \ 209*4882a593Smuzhiyun /* flush_thread will update pgd cache */ \ 210*4882a593Smuzhiyun if (personality(current->personality) != PER_LINUX32) \ 211*4882a593Smuzhiyun set_personality(PER_LINUX | \ 212*4882a593Smuzhiyun (current->personality & (~PER_MASK))); \ 213*4882a593Smuzhiyun } while (0) 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun extern unsigned int vdso_enabled; 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun #define ARCH_DLINFO \ 218*4882a593Smuzhiyun do { \ 219*4882a593Smuzhiyun extern struct adi_config adi_state; \ 220*4882a593Smuzhiyun if (vdso_enabled) \ 221*4882a593Smuzhiyun NEW_AUX_ENT(AT_SYSINFO_EHDR, \ 222*4882a593Smuzhiyun (unsigned long)current->mm->context.vdso); \ 223*4882a593Smuzhiyun NEW_AUX_ENT(AT_ADI_BLKSZ, adi_state.caps.blksz); \ 224*4882a593Smuzhiyun NEW_AUX_ENT(AT_ADI_NBITS, adi_state.caps.nbits); \ 225*4882a593Smuzhiyun NEW_AUX_ENT(AT_ADI_UEONADI, adi_state.caps.ue_on_adi); \ 226*4882a593Smuzhiyun } while (0) 227*4882a593Smuzhiyun 228*4882a593Smuzhiyun struct linux_binprm; 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 231*4882a593Smuzhiyun extern int arch_setup_additional_pages(struct linux_binprm *bprm, 232*4882a593Smuzhiyun int uses_interp); 233*4882a593Smuzhiyun #endif /* !(__ASM_SPARC64_ELF_H) */ 234