1fcdfe9d2SHuacai Chen /* SPDX-License-Identifier: GPL-2.0 */ 2fcdfe9d2SHuacai Chen /* 3fcdfe9d2SHuacai Chen * Copyright (C) 2020-2022 Loongson Technology Corporation Limited 4fcdfe9d2SHuacai Chen */ 5fcdfe9d2SHuacai Chen #ifndef _ASM_ELF_H 6fcdfe9d2SHuacai Chen #define _ASM_ELF_H 7fcdfe9d2SHuacai Chen 8fcdfe9d2SHuacai Chen #include <linux/auxvec.h> 9fcdfe9d2SHuacai Chen #include <linux/fs.h> 10fcdfe9d2SHuacai Chen #include <uapi/linux/elf.h> 11fcdfe9d2SHuacai Chen 12fcdfe9d2SHuacai Chen #include <asm/current.h> 13fcdfe9d2SHuacai Chen #include <asm/vdso.h> 14fcdfe9d2SHuacai Chen 15fcdfe9d2SHuacai Chen /* The ABI of a file. */ 16fcdfe9d2SHuacai Chen #define EF_LOONGARCH_ABI_LP64_SOFT_FLOAT 0x1 17fcdfe9d2SHuacai Chen #define EF_LOONGARCH_ABI_LP64_SINGLE_FLOAT 0x2 18fcdfe9d2SHuacai Chen #define EF_LOONGARCH_ABI_LP64_DOUBLE_FLOAT 0x3 19fcdfe9d2SHuacai Chen 20fcdfe9d2SHuacai Chen #define EF_LOONGARCH_ABI_ILP32_SOFT_FLOAT 0x5 21fcdfe9d2SHuacai Chen #define EF_LOONGARCH_ABI_ILP32_SINGLE_FLOAT 0x6 22fcdfe9d2SHuacai Chen #define EF_LOONGARCH_ABI_ILP32_DOUBLE_FLOAT 0x7 23fcdfe9d2SHuacai Chen 24fcdfe9d2SHuacai Chen /* LoongArch relocation types used by the dynamic linker */ 25fcdfe9d2SHuacai Chen #define R_LARCH_NONE 0 26fcdfe9d2SHuacai Chen #define R_LARCH_32 1 27fcdfe9d2SHuacai Chen #define R_LARCH_64 2 28fcdfe9d2SHuacai Chen #define R_LARCH_RELATIVE 3 29fcdfe9d2SHuacai Chen #define R_LARCH_COPY 4 30fcdfe9d2SHuacai Chen #define R_LARCH_JUMP_SLOT 5 31fcdfe9d2SHuacai Chen #define R_LARCH_TLS_DTPMOD32 6 32fcdfe9d2SHuacai Chen #define R_LARCH_TLS_DTPMOD64 7 33fcdfe9d2SHuacai Chen #define R_LARCH_TLS_DTPREL32 8 34fcdfe9d2SHuacai Chen #define R_LARCH_TLS_DTPREL64 9 35fcdfe9d2SHuacai Chen #define R_LARCH_TLS_TPREL32 10 36fcdfe9d2SHuacai Chen #define R_LARCH_TLS_TPREL64 11 37fcdfe9d2SHuacai Chen #define R_LARCH_IRELATIVE 12 38fcdfe9d2SHuacai Chen #define R_LARCH_MARK_LA 20 39fcdfe9d2SHuacai Chen #define R_LARCH_MARK_PCREL 21 40fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_PCREL 22 41fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_ABSOLUTE 23 42fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_DUP 24 43fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_GPREL 25 44fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_TLS_TPREL 26 45fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_TLS_GOT 27 46fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_TLS_GD 28 47fcdfe9d2SHuacai Chen #define R_LARCH_SOP_PUSH_PLT_PCREL 29 48fcdfe9d2SHuacai Chen #define R_LARCH_SOP_ASSERT 30 49fcdfe9d2SHuacai Chen #define R_LARCH_SOP_NOT 31 50fcdfe9d2SHuacai Chen #define R_LARCH_SOP_SUB 32 51fcdfe9d2SHuacai Chen #define R_LARCH_SOP_SL 33 52fcdfe9d2SHuacai Chen #define R_LARCH_SOP_SR 34 53fcdfe9d2SHuacai Chen #define R_LARCH_SOP_ADD 35 54fcdfe9d2SHuacai Chen #define R_LARCH_SOP_AND 36 55fcdfe9d2SHuacai Chen #define R_LARCH_SOP_IF_ELSE 37 56fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_10_5 38 57fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_U_10_12 39 58fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_10_12 40 59fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_10_16 41 60fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_10_16_S2 42 61fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_5_20 43 62fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_0_5_10_16_S2 44 63fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_S_0_10_10_16_S2 45 64fcdfe9d2SHuacai Chen #define R_LARCH_SOP_POP_32_U 46 65fcdfe9d2SHuacai Chen #define R_LARCH_ADD8 47 66fcdfe9d2SHuacai Chen #define R_LARCH_ADD16 48 67fcdfe9d2SHuacai Chen #define R_LARCH_ADD24 49 68fcdfe9d2SHuacai Chen #define R_LARCH_ADD32 50 69fcdfe9d2SHuacai Chen #define R_LARCH_ADD64 51 70fcdfe9d2SHuacai Chen #define R_LARCH_SUB8 52 71fcdfe9d2SHuacai Chen #define R_LARCH_SUB16 53 72fcdfe9d2SHuacai Chen #define R_LARCH_SUB24 54 73fcdfe9d2SHuacai Chen #define R_LARCH_SUB32 55 74fcdfe9d2SHuacai Chen #define R_LARCH_SUB64 56 75fcdfe9d2SHuacai Chen #define R_LARCH_GNU_VTINHERIT 57 76fcdfe9d2SHuacai Chen #define R_LARCH_GNU_VTENTRY 58 770a75e5d1SXi Ruoyao #define R_LARCH_B16 64 780a75e5d1SXi Ruoyao #define R_LARCH_B21 65 790a75e5d1SXi Ruoyao #define R_LARCH_B26 66 800a75e5d1SXi Ruoyao #define R_LARCH_ABS_HI20 67 810a75e5d1SXi Ruoyao #define R_LARCH_ABS_LO12 68 820a75e5d1SXi Ruoyao #define R_LARCH_ABS64_LO20 69 830a75e5d1SXi Ruoyao #define R_LARCH_ABS64_HI12 70 840a75e5d1SXi Ruoyao #define R_LARCH_PCALA_HI20 71 850a75e5d1SXi Ruoyao #define R_LARCH_PCALA_LO12 72 860a75e5d1SXi Ruoyao #define R_LARCH_PCALA64_LO20 73 870a75e5d1SXi Ruoyao #define R_LARCH_PCALA64_HI12 74 880a75e5d1SXi Ruoyao #define R_LARCH_GOT_PC_HI20 75 890a75e5d1SXi Ruoyao #define R_LARCH_GOT_PC_LO12 76 900a75e5d1SXi Ruoyao #define R_LARCH_GOT64_PC_LO20 77 910a75e5d1SXi Ruoyao #define R_LARCH_GOT64_PC_HI12 78 920a75e5d1SXi Ruoyao #define R_LARCH_GOT_HI20 79 930a75e5d1SXi Ruoyao #define R_LARCH_GOT_LO12 80 940a75e5d1SXi Ruoyao #define R_LARCH_GOT64_LO20 81 950a75e5d1SXi Ruoyao #define R_LARCH_GOT64_HI12 82 960a75e5d1SXi Ruoyao #define R_LARCH_TLS_LE_HI20 83 970a75e5d1SXi Ruoyao #define R_LARCH_TLS_LE_LO12 84 980a75e5d1SXi Ruoyao #define R_LARCH_TLS_LE64_LO20 85 990a75e5d1SXi Ruoyao #define R_LARCH_TLS_LE64_HI12 86 1000a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE_PC_HI20 87 1010a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE_PC_LO12 88 1020a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE64_PC_LO20 89 1030a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE64_PC_HI12 90 1040a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE_HI20 91 1050a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE_LO12 92 1060a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE64_LO20 93 1070a75e5d1SXi Ruoyao #define R_LARCH_TLS_IE64_HI12 94 1080a75e5d1SXi Ruoyao #define R_LARCH_TLS_LD_PC_HI20 95 1090a75e5d1SXi Ruoyao #define R_LARCH_TLS_LD_HI20 96 1100a75e5d1SXi Ruoyao #define R_LARCH_TLS_GD_PC_HI20 97 1110a75e5d1SXi Ruoyao #define R_LARCH_TLS_GD_HI20 98 1120a75e5d1SXi Ruoyao #define R_LARCH_32_PCREL 99 1130a75e5d1SXi Ruoyao #define R_LARCH_RELAX 100 11427614988STiezhu Yang #define R_LARCH_DELETE 101 11527614988STiezhu Yang #define R_LARCH_ALIGN 102 11627614988STiezhu Yang #define R_LARCH_PCREL20_S2 103 11727614988STiezhu Yang #define R_LARCH_CFA 104 11827614988STiezhu Yang #define R_LARCH_ADD6 105 11927614988STiezhu Yang #define R_LARCH_SUB6 106 12027614988STiezhu Yang #define R_LARCH_ADD_ULEB128 107 12127614988STiezhu Yang #define R_LARCH_SUB_ULEB128 108 12227614988STiezhu Yang #define R_LARCH_64_PCREL 109 123fcdfe9d2SHuacai Chen 124fcdfe9d2SHuacai Chen #ifndef ELF_ARCH 125fcdfe9d2SHuacai Chen 126fcdfe9d2SHuacai Chen /* ELF register definitions */ 127fcdfe9d2SHuacai Chen 128fcdfe9d2SHuacai Chen /* 129fcdfe9d2SHuacai Chen * General purpose have the following registers: 130fcdfe9d2SHuacai Chen * Register Number 131fcdfe9d2SHuacai Chen * GPRs 32 132fcdfe9d2SHuacai Chen * ORIG_A0 1 133fcdfe9d2SHuacai Chen * ERA 1 134fcdfe9d2SHuacai Chen * BADVADDR 1 135fcdfe9d2SHuacai Chen * CRMD 1 136fcdfe9d2SHuacai Chen * PRMD 1 137fcdfe9d2SHuacai Chen * EUEN 1 138fcdfe9d2SHuacai Chen * ECFG 1 139fcdfe9d2SHuacai Chen * ESTAT 1 140fcdfe9d2SHuacai Chen * Reserved 5 141fcdfe9d2SHuacai Chen */ 142fcdfe9d2SHuacai Chen #define ELF_NGREG 45 143fcdfe9d2SHuacai Chen 144fcdfe9d2SHuacai Chen /* 145fcdfe9d2SHuacai Chen * Floating point have the following registers: 146fcdfe9d2SHuacai Chen * Register Number 147fcdfe9d2SHuacai Chen * FPR 32 148fcdfe9d2SHuacai Chen * FCC 1 149fcdfe9d2SHuacai Chen * FCSR 1 150fcdfe9d2SHuacai Chen */ 151fcdfe9d2SHuacai Chen #define ELF_NFPREG 34 152fcdfe9d2SHuacai Chen 153fcdfe9d2SHuacai Chen typedef unsigned long elf_greg_t; 154fcdfe9d2SHuacai Chen typedef elf_greg_t elf_gregset_t[ELF_NGREG]; 155fcdfe9d2SHuacai Chen 156fcdfe9d2SHuacai Chen typedef double elf_fpreg_t; 157fcdfe9d2SHuacai Chen typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG]; 158fcdfe9d2SHuacai Chen 159fcdfe9d2SHuacai Chen void loongarch_dump_regs64(u64 *uregs, const struct pt_regs *regs); 160fcdfe9d2SHuacai Chen 161fcdfe9d2SHuacai Chen #ifdef CONFIG_32BIT 162fcdfe9d2SHuacai Chen /* 163fcdfe9d2SHuacai Chen * This is used to ensure we don't load something for the wrong architecture. 164fcdfe9d2SHuacai Chen */ 165fcdfe9d2SHuacai Chen #define elf_check_arch elf32_check_arch 166fcdfe9d2SHuacai Chen 167fcdfe9d2SHuacai Chen /* 168fcdfe9d2SHuacai Chen * These are used to set parameters in the core dumps. 169fcdfe9d2SHuacai Chen */ 170fcdfe9d2SHuacai Chen #define ELF_CLASS ELFCLASS32 171fcdfe9d2SHuacai Chen 172fcdfe9d2SHuacai Chen #define ELF_CORE_COPY_REGS(dest, regs) \ 173fcdfe9d2SHuacai Chen loongarch_dump_regs32((u32 *)&(dest), (regs)); 174fcdfe9d2SHuacai Chen 175fcdfe9d2SHuacai Chen #endif /* CONFIG_32BIT */ 176fcdfe9d2SHuacai Chen 177fcdfe9d2SHuacai Chen #ifdef CONFIG_64BIT 178fcdfe9d2SHuacai Chen /* 179fcdfe9d2SHuacai Chen * This is used to ensure we don't load something for the wrong architecture. 180fcdfe9d2SHuacai Chen */ 181fcdfe9d2SHuacai Chen #define elf_check_arch elf64_check_arch 182fcdfe9d2SHuacai Chen 183fcdfe9d2SHuacai Chen /* 184fcdfe9d2SHuacai Chen * These are used to set parameters in the core dumps. 185fcdfe9d2SHuacai Chen */ 186fcdfe9d2SHuacai Chen #define ELF_CLASS ELFCLASS64 187fcdfe9d2SHuacai Chen 188fcdfe9d2SHuacai Chen #define ELF_CORE_COPY_REGS(dest, regs) \ 189fcdfe9d2SHuacai Chen loongarch_dump_regs64((u64 *)&(dest), (regs)); 190fcdfe9d2SHuacai Chen 191fcdfe9d2SHuacai Chen #endif /* CONFIG_64BIT */ 192fcdfe9d2SHuacai Chen 193fcdfe9d2SHuacai Chen /* 194fcdfe9d2SHuacai Chen * These are used to set parameters in the core dumps. 195fcdfe9d2SHuacai Chen */ 196fcdfe9d2SHuacai Chen #define ELF_DATA ELFDATA2LSB 197fcdfe9d2SHuacai Chen #define ELF_ARCH EM_LOONGARCH 198fcdfe9d2SHuacai Chen 199fcdfe9d2SHuacai Chen #endif /* !defined(ELF_ARCH) */ 200fcdfe9d2SHuacai Chen 201fcdfe9d2SHuacai Chen #define loongarch_elf_check_machine(x) ((x)->e_machine == EM_LOONGARCH) 202fcdfe9d2SHuacai Chen 203fcdfe9d2SHuacai Chen #define vmcore_elf32_check_arch loongarch_elf_check_machine 204fcdfe9d2SHuacai Chen #define vmcore_elf64_check_arch loongarch_elf_check_machine 205fcdfe9d2SHuacai Chen 206fcdfe9d2SHuacai Chen /* 207fcdfe9d2SHuacai Chen * Return non-zero if HDR identifies an 32bit ELF binary. 208fcdfe9d2SHuacai Chen */ 209fcdfe9d2SHuacai Chen #define elf32_check_arch(hdr) \ 210fcdfe9d2SHuacai Chen ({ \ 211fcdfe9d2SHuacai Chen int __res = 1; \ 212fcdfe9d2SHuacai Chen struct elfhdr *__h = (hdr); \ 213fcdfe9d2SHuacai Chen \ 214fcdfe9d2SHuacai Chen if (!loongarch_elf_check_machine(__h)) \ 215fcdfe9d2SHuacai Chen __res = 0; \ 216fcdfe9d2SHuacai Chen if (__h->e_ident[EI_CLASS] != ELFCLASS32) \ 217fcdfe9d2SHuacai Chen __res = 0; \ 218fcdfe9d2SHuacai Chen \ 219fcdfe9d2SHuacai Chen __res; \ 220fcdfe9d2SHuacai Chen }) 221fcdfe9d2SHuacai Chen 222fcdfe9d2SHuacai Chen /* 223fcdfe9d2SHuacai Chen * Return non-zero if HDR identifies an 64bit ELF binary. 224fcdfe9d2SHuacai Chen */ 225fcdfe9d2SHuacai Chen #define elf64_check_arch(hdr) \ 226fcdfe9d2SHuacai Chen ({ \ 227fcdfe9d2SHuacai Chen int __res = 1; \ 228fcdfe9d2SHuacai Chen struct elfhdr *__h = (hdr); \ 229fcdfe9d2SHuacai Chen \ 230fcdfe9d2SHuacai Chen if (!loongarch_elf_check_machine(__h)) \ 231fcdfe9d2SHuacai Chen __res = 0; \ 232fcdfe9d2SHuacai Chen if (__h->e_ident[EI_CLASS] != ELFCLASS64) \ 233fcdfe9d2SHuacai Chen __res = 0; \ 234fcdfe9d2SHuacai Chen \ 235fcdfe9d2SHuacai Chen __res; \ 236fcdfe9d2SHuacai Chen }) 237fcdfe9d2SHuacai Chen 238fcdfe9d2SHuacai Chen #ifdef CONFIG_32BIT 239fcdfe9d2SHuacai Chen 240fcdfe9d2SHuacai Chen #define SET_PERSONALITY2(ex, state) \ 241fcdfe9d2SHuacai Chen do { \ 242fcdfe9d2SHuacai Chen current->thread.vdso = &vdso_info; \ 243fcdfe9d2SHuacai Chen \ 244fcdfe9d2SHuacai Chen if (personality(current->personality) != PER_LINUX) \ 245fcdfe9d2SHuacai Chen set_personality(PER_LINUX); \ 246fcdfe9d2SHuacai Chen } while (0) 247fcdfe9d2SHuacai Chen 248fcdfe9d2SHuacai Chen #endif /* CONFIG_32BIT */ 249fcdfe9d2SHuacai Chen 250fcdfe9d2SHuacai Chen #ifdef CONFIG_64BIT 251fcdfe9d2SHuacai Chen 252fcdfe9d2SHuacai Chen #define SET_PERSONALITY2(ex, state) \ 253fcdfe9d2SHuacai Chen do { \ 254fcdfe9d2SHuacai Chen unsigned int p; \ 255fcdfe9d2SHuacai Chen \ 256fcdfe9d2SHuacai Chen clear_thread_flag(TIF_32BIT_REGS); \ 257fcdfe9d2SHuacai Chen clear_thread_flag(TIF_32BIT_ADDR); \ 258fcdfe9d2SHuacai Chen \ 259fcdfe9d2SHuacai Chen current->thread.vdso = &vdso_info; \ 260fcdfe9d2SHuacai Chen \ 261fcdfe9d2SHuacai Chen p = personality(current->personality); \ 262fcdfe9d2SHuacai Chen if (p != PER_LINUX32 && p != PER_LINUX) \ 263fcdfe9d2SHuacai Chen set_personality(PER_LINUX); \ 264fcdfe9d2SHuacai Chen } while (0) 265fcdfe9d2SHuacai Chen 266fcdfe9d2SHuacai Chen #endif /* CONFIG_64BIT */ 267fcdfe9d2SHuacai Chen 268fcdfe9d2SHuacai Chen #define CORE_DUMP_USE_REGSET 269fcdfe9d2SHuacai Chen #define ELF_EXEC_PAGESIZE PAGE_SIZE 270fcdfe9d2SHuacai Chen 271fcdfe9d2SHuacai Chen /* 272fcdfe9d2SHuacai Chen * This yields a mask that user programs can use to figure out what 273fcdfe9d2SHuacai Chen * instruction set this cpu supports. This could be done in userspace, 274fcdfe9d2SHuacai Chen * but it's not easy, and we've already done it here. 275fcdfe9d2SHuacai Chen */ 276fcdfe9d2SHuacai Chen 277fcdfe9d2SHuacai Chen #define ELF_HWCAP (elf_hwcap) 278fcdfe9d2SHuacai Chen extern unsigned int elf_hwcap; 279fcdfe9d2SHuacai Chen #include <asm/hwcap.h> 280fcdfe9d2SHuacai Chen 281fcdfe9d2SHuacai Chen /* 282fcdfe9d2SHuacai Chen * This yields a string that ld.so will use to load implementation 283fcdfe9d2SHuacai Chen * specific libraries for optimization. This is more specific in 284fcdfe9d2SHuacai Chen * intent than poking at uname or /proc/cpuinfo. 285fcdfe9d2SHuacai Chen */ 286fcdfe9d2SHuacai Chen 287fcdfe9d2SHuacai Chen #define ELF_PLATFORM __elf_platform 288fcdfe9d2SHuacai Chen extern const char *__elf_platform; 289fcdfe9d2SHuacai Chen 290fcdfe9d2SHuacai Chen #define ELF_PLAT_INIT(_r, load_addr) do { \ 291fcdfe9d2SHuacai Chen _r->regs[1] = _r->regs[2] = _r->regs[3] = _r->regs[4] = 0; \ 292fcdfe9d2SHuacai Chen _r->regs[5] = _r->regs[6] = _r->regs[7] = _r->regs[8] = 0; \ 293*4dd2d87cSHengqi Chen _r->regs[9] = _r->regs[10] /* syscall n */ = _r->regs[12] = 0; \ 294fcdfe9d2SHuacai Chen _r->regs[13] = _r->regs[14] = _r->regs[15] = _r->regs[16] = 0; \ 295fcdfe9d2SHuacai Chen _r->regs[17] = _r->regs[18] = _r->regs[19] = _r->regs[20] = 0; \ 296fcdfe9d2SHuacai Chen _r->regs[21] = _r->regs[22] = _r->regs[23] = _r->regs[24] = 0; \ 297fcdfe9d2SHuacai Chen _r->regs[25] = _r->regs[26] = _r->regs[27] = _r->regs[28] = 0; \ 298fcdfe9d2SHuacai Chen _r->regs[29] = _r->regs[30] = _r->regs[31] = 0; \ 299fcdfe9d2SHuacai Chen } while (0) 300fcdfe9d2SHuacai Chen 301fcdfe9d2SHuacai Chen /* 302fcdfe9d2SHuacai Chen * This is the location that an ET_DYN program is loaded if exec'ed. Typical 303fcdfe9d2SHuacai Chen * use of this is to invoke "./ld.so someprog" to test out a new version of 304fcdfe9d2SHuacai Chen * the loader. We need to make sure that it is out of the way of the program 305fcdfe9d2SHuacai Chen * that it will "exec", and that there is sufficient room for the brk. 306fcdfe9d2SHuacai Chen */ 307fcdfe9d2SHuacai Chen 308fcdfe9d2SHuacai Chen #define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2) 309fcdfe9d2SHuacai Chen 310fcdfe9d2SHuacai Chen /* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */ 311fcdfe9d2SHuacai Chen #define ARCH_DLINFO \ 312fcdfe9d2SHuacai Chen do { \ 313fcdfe9d2SHuacai Chen NEW_AUX_ENT(AT_SYSINFO_EHDR, \ 314fcdfe9d2SHuacai Chen (unsigned long)current->mm->context.vdso); \ 315fcdfe9d2SHuacai Chen } while (0) 316fcdfe9d2SHuacai Chen 317fcdfe9d2SHuacai Chen #define ARCH_HAS_SETUP_ADDITIONAL_PAGES 1 318fcdfe9d2SHuacai Chen struct linux_binprm; 319fcdfe9d2SHuacai Chen extern int arch_setup_additional_pages(struct linux_binprm *bprm, 320fcdfe9d2SHuacai Chen int uses_interp); 321fcdfe9d2SHuacai Chen 322fcdfe9d2SHuacai Chen struct arch_elf_state { 323fcdfe9d2SHuacai Chen int fp_abi; 324fcdfe9d2SHuacai Chen int interp_fp_abi; 325fcdfe9d2SHuacai Chen }; 326fcdfe9d2SHuacai Chen 327fcdfe9d2SHuacai Chen #define LOONGARCH_ABI_FP_ANY (0) 328fcdfe9d2SHuacai Chen 329fcdfe9d2SHuacai Chen #define INIT_ARCH_ELF_STATE { \ 330fcdfe9d2SHuacai Chen .fp_abi = LOONGARCH_ABI_FP_ANY, \ 331fcdfe9d2SHuacai Chen .interp_fp_abi = LOONGARCH_ABI_FP_ANY, \ 332fcdfe9d2SHuacai Chen } 333fcdfe9d2SHuacai Chen 334fcdfe9d2SHuacai Chen extern int arch_elf_pt_proc(void *ehdr, void *phdr, struct file *elf, 335fcdfe9d2SHuacai Chen bool is_interp, struct arch_elf_state *state); 336fcdfe9d2SHuacai Chen 337fcdfe9d2SHuacai Chen extern int arch_check_elf(void *ehdr, bool has_interpreter, void *interp_ehdr, 338fcdfe9d2SHuacai Chen struct arch_elf_state *state); 339fcdfe9d2SHuacai Chen 340fcdfe9d2SHuacai Chen #endif /* _ASM_ELF_H */ 341