^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef __ASMm68k_ELF_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define __ASMm68k_ELF_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * ELF register definitions..
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <asm/user.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * 68k ELF relocation types
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define R_68K_NONE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define R_68K_32 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #define R_68K_16 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define R_68K_8 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define R_68K_PC32 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define R_68K_PC16 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define R_68K_PC8 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define R_68K_GOT32 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define R_68K_GOT16 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define R_68K_GOT8 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define R_68K_GOT32O 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define R_68K_GOT16O 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define R_68K_GOT8O 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define R_68K_PLT32 13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define R_68K_PLT16 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define R_68K_PLT8 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define R_68K_PLT32O 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define R_68K_PLT16O 17
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define R_68K_PLT8O 18
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define R_68K_COPY 19
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define R_68K_GLOB_DAT 20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define R_68K_JMP_SLOT 21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #define R_68K_RELATIVE 22
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) typedef unsigned long elf_greg_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define ELF_NGREG (sizeof(struct user_regs_struct) / sizeof(elf_greg_t))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) typedef elf_greg_t elf_gregset_t[ELF_NGREG];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) typedef struct user_m68kfp_struct elf_fpregset_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * This is used to ensure we don't load something for the wrong architecture.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define elf_check_arch(x) ((x)->e_machine == EM_68K)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) * These are used to set parameters in the core dumps.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define ELF_CLASS ELFCLASS32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define ELF_DATA ELFDATA2MSB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define ELF_ARCH EM_68K
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) /* For SVR4/m68k the function pointer to be registered with `atexit' is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) passed in %a1. Although my copy of the ABI has no such statement, it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) is actually used on ASV. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define ELF_PLAT_INIT(_r, load_addr) _r->a1 = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #if defined(CONFIG_SUN3) || defined(CONFIG_COLDFIRE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define ELF_EXEC_PAGESIZE 8192
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define ELF_EXEC_PAGESIZE 4096
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /* This is the location that an ET_DYN program is loaded if exec'ed. Typical
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) use of this is to invoke "./ld.so someprog" to test out a new version of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) the loader. We need to make sure that it is out of the way of the program
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) that it will "exec", and that there is sufficient room for the brk. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #ifndef CONFIG_SUN3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) #define ELF_ET_DYN_BASE 0xD0000000UL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) #define ELF_ET_DYN_BASE 0x0D800000UL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) #define ELF_CORE_COPY_REGS(pr_reg, regs) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) /* Bleech. */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) pr_reg[0] = regs->d1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) pr_reg[1] = regs->d2; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) pr_reg[2] = regs->d3; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) pr_reg[3] = regs->d4; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) pr_reg[4] = regs->d5; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) pr_reg[7] = regs->a0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) pr_reg[8] = regs->a1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) pr_reg[9] = regs->a2; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) pr_reg[14] = regs->d0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) pr_reg[15] = rdusp(); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) pr_reg[16] = regs->orig_d0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) pr_reg[17] = regs->sr; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) pr_reg[18] = regs->pc; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) pr_reg[19] = (regs->format << 12) | regs->vector; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) struct switch_stack *sw = ((struct switch_stack *)regs) - 1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) pr_reg[5] = sw->d6; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) pr_reg[6] = sw->d7; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) pr_reg[10] = sw->a3; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) pr_reg[11] = sw->a4; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) pr_reg[12] = sw->a5; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) pr_reg[13] = sw->a6; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) /* This yields a mask that user programs can use to figure out what
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) instruction set this cpu supports. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define ELF_HWCAP (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) /* This yields a string that ld.so will use to load implementation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) specific libraries for optimization. This is more specific in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) intent than poking at uname or /proc/cpuinfo. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define ELF_PLATFORM (NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #endif