Message ID | 20230505071850.228734-5-npiggin@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | powerpc/64: ELFv2 conversion | expand |
Le 05/05/2023 à 09:18, Nicholas Piggin a écrit : > User code must still support ELFv1, e.g., see is_elf2_task(). > > This one should wait a while until ELFv2 fallout settles, so > just posting it out of interest. Can't ELFv1 user code run on an ELFv2 kernel ? Christophe > > Thanks, > Nick > --- > arch/powerpc/Kconfig | 19 ------ > arch/powerpc/Makefile | 15 +---- > arch/powerpc/boot/Makefile | 4 +- > arch/powerpc/include/asm/code-patching.h | 36 ++-------- > arch/powerpc/include/asm/kfence.h | 4 -- > arch/powerpc/include/asm/linkage.h | 9 --- > arch/powerpc/include/asm/module.h | 3 - > arch/powerpc/include/asm/ppc_asm.h | 38 +---------- > arch/powerpc/include/asm/ptrace.h | 17 +---- > arch/powerpc/include/asm/sections.h | 4 -- > arch/powerpc/kernel/exceptions-64s.S | 2 +- > arch/powerpc/kernel/fadump.c | 6 +- > arch/powerpc/kernel/head_64.S | 5 +- > arch/powerpc/kernel/interrupt_64.S | 4 -- > arch/powerpc/kernel/kprobes.c | 39 +---------- > arch/powerpc/kernel/misc_64.S | 4 -- > arch/powerpc/kernel/module.c | 8 --- > arch/powerpc/kernel/module_64.c | 84 ++++-------------------- > arch/powerpc/kernel/trace/ftrace.c | 10 --- > arch/powerpc/kernel/vdso/Makefile | 2 +- > arch/powerpc/kernel/vdso/gettimeofday.S | 2 +- > arch/powerpc/kernel/vmlinux.lds.S | 8 --- > arch/powerpc/kvm/book3s_hv_rmhandlers.S | 36 +++++----- > arch/powerpc/kvm/book3s_interrupts.S | 14 ++-- > arch/powerpc/kvm/book3s_rmhandlers.S | 12 +--- > arch/powerpc/net/bpf_jit.h | 6 -- > arch/powerpc/net/bpf_jit_comp.c | 14 ++-- > arch/powerpc/net/bpf_jit_comp64.c | 13 ++-- > arch/powerpc/platforms/Kconfig.cputype | 6 -- > drivers/crypto/vmx/Makefile | 4 -- > kernel/extable.c | 2 +- > kernel/trace/ftrace.c | 12 ---- > 32 files changed, 68 insertions(+), 374 deletions(-) > > diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig > index a64bfd9b8a1d..6cbcaf1d01a6 100644 > --- a/arch/powerpc/Kconfig > +++ b/arch/powerpc/Kconfig > @@ -1,9 +1,6 @@ > # SPDX-License-Identifier: GPL-2.0 > source "arch/powerpc/platforms/Kconfig.cputype" > > -config CC_HAS_ELFV2 > - def_bool PPC64 && $(cc-option, -mabi=elfv2) > - > config CC_HAS_PREFIXED > def_bool PPC64 && $(cc-option, -mcpu=power10 -mprefixed) > > @@ -232,7 +229,6 @@ config PPC > select HAVE_EFFICIENT_UNALIGNED_ACCESS > select HAVE_FAST_GUP > select HAVE_FTRACE_MCOUNT_RECORD > - select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1 > select HAVE_FUNCTION_ERROR_INJECTION > select HAVE_FUNCTION_GRAPH_TRACER > select HAVE_FUNCTION_TRACER > @@ -623,21 +619,6 @@ config KEXEC_FILE > config ARCH_HAS_KEXEC_PURGATORY > def_bool KEXEC_FILE > > -config PPC64_BIG_ENDIAN_ELF_ABI_V2 > - prompt "Build big-endian kernel using ELF ABI V2" if LD_IS_BFD && EXPERT > - def_bool y > - depends on PPC64 && CPU_BIG_ENDIAN > - depends on CC_HAS_ELFV2 > - help > - This builds the kernel image using the "Power Architecture 64-Bit ELF > - V2 ABI Specification", which has a reduced stack overhead and faster > - function calls. This internal kernel ABI option does not affect > - userspace compatibility. > - > - The V2 ABI is standard for 64-bit little-endian, but for big-endian > - it is less well tested by kernel and toolchain. However some distros > - build userspace this way, and it can produce a functioning kernel. > - > config RELOCATABLE > bool "Build a relocatable kernel" > depends on PPC64 || (FLATMEM && (44x || PPC_85xx)) > diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile > index dca73f673d70..8ddc779e675f 100644 > --- a/arch/powerpc/Makefile > +++ b/arch/powerpc/Makefile > @@ -72,10 +72,8 @@ endif > > ifdef CONFIG_PPC64 > ifndef CONFIG_CC_IS_CLANG > -cflags-$(CONFIG_PPC64_ELF_ABI_V1) += $(call cc-option,-mabi=elfv1) > -cflags-$(CONFIG_PPC64_ELF_ABI_V1) += $(call cc-option,-mcall-aixdesc) > -aflags-$(CONFIG_PPC64_ELF_ABI_V1) += $(call cc-option,-mabi=elfv1) > -aflags-$(CONFIG_PPC64_ELF_ABI_V2) += -mabi=elfv2 > +#Is this even needed? > +aflags-y += -mabi=elfv2 > endif > endif > > @@ -125,14 +123,7 @@ endif > endif > > CFLAGS-$(CONFIG_PPC64) := $(call cc-option,-mtraceback=no) > -ifdef CONFIG_PPC64_ELF_ABI_V2 > -CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv2,$(call cc-option,-mcall-aixdesc)) > -else > -ifndef CONFIG_CC_IS_CLANG > -CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv1) > -CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcall-aixdesc) > -endif > -endif > +CFLAGS-$(CONFIG_PPC64) += -mabi=elfv2 > CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,$(call cc-option,-mminimal-toc)) > CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mno-pointers-to-nested-functions) > CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mlong-double-128) > diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile > index 85cde5bf04b7..e6979f4ea571 100644 > --- a/arch/powerpc/boot/Makefile > +++ b/arch/powerpc/boot/Makefile > @@ -42,9 +42,7 @@ BOOTCFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ > > ifdef CONFIG_PPC64_BOOT_WRAPPER > BOOTCFLAGS += -m64 > -ifdef CONFIG_PPC64_ELF_ABI_V2 > -BOOTCFLAGS += $(call cc-option,-mabi=elfv2) > -endif > +BOOTCFLAGS += -mabi=elfv2 > else > BOOTCFLAGS += -m32 > endif > diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h > index 3f881548fb61..90508151e5f4 100644 > --- a/arch/powerpc/include/asm/code-patching.h > +++ b/arch/powerpc/include/asm/code-patching.h > @@ -130,7 +130,7 @@ bool is_conditional_branch(ppc_inst_t instr); > > static inline unsigned long ppc_function_entry(void *func) > { > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > +#ifdef CONFIG_PPC64 > u32 *insn = func; > > /* > @@ -155,13 +155,6 @@ static inline unsigned long ppc_function_entry(void *func) > return (unsigned long)(insn + 2); > else > return (unsigned long)func; > -#elif defined(CONFIG_PPC64_ELF_ABI_V1) > - /* > - * On PPC64 ABIv1 the function pointer actually points to the > - * function's descriptor. The first entry in the descriptor is the > - * address of the function text. > - */ > - return ((struct func_desc *)func)->addr; > #else > return (unsigned long)func; > #endif > @@ -169,7 +162,7 @@ static inline unsigned long ppc_function_entry(void *func) > > static inline unsigned long ppc_global_function_entry(void *func) > { > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > +#ifdef CONFIG_PPC64 > /* PPC64 ABIv2 the global entry point is at the address */ > return (unsigned long)func; > #else > @@ -186,28 +179,7 @@ static inline unsigned long ppc_global_function_entry(void *func) > static inline unsigned long ppc_kallsyms_lookup_name(const char *name) > { > unsigned long addr; > -#ifdef CONFIG_PPC64_ELF_ABI_V1 > - /* check for dot variant */ > - char dot_name[1 + KSYM_NAME_LEN]; > - bool dot_appended = false; > - > - if (strnlen(name, KSYM_NAME_LEN) >= KSYM_NAME_LEN) > - return 0; > - > - if (name[0] != '.') { > - dot_name[0] = '.'; > - dot_name[1] = '\0'; > - strlcat(dot_name, name, sizeof(dot_name)); > - dot_appended = true; > - } else { > - dot_name[0] = '\0'; > - strlcat(dot_name, name, sizeof(dot_name)); > - } > - addr = kallsyms_lookup_name(dot_name); > - if (!addr && dot_appended) > - /* Let's try the original non-dot symbol lookup */ > - addr = kallsyms_lookup_name(name); > -#elif defined(CONFIG_PPC64_ELF_ABI_V2) > +#ifdef CONFIG_PPC64 > addr = kallsyms_lookup_name(name); > if (addr) > addr = ppc_function_entry((void *)addr); > @@ -223,7 +195,7 @@ static inline unsigned long ppc_kallsyms_lookup_name(const char *name) > */ > > /* This must match the definition of STK_GOT in <asm/ppc_asm.h> */ > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > +#ifdef CONFIG_PPC64 > #define R2_STACK_OFFSET 24 > #else > #define R2_STACK_OFFSET 40 > diff --git a/arch/powerpc/include/asm/kfence.h b/arch/powerpc/include/asm/kfence.h > index 6fd2b4d486c5..5e79b69b2764 100644 > --- a/arch/powerpc/include/asm/kfence.h > +++ b/arch/powerpc/include/asm/kfence.h > @@ -11,10 +11,6 @@ > #include <linux/mm.h> > #include <asm/pgtable.h> > > -#ifdef CONFIG_PPC64_ELF_ABI_V1 > -#define ARCH_FUNC_PREFIX "." > -#endif > - > static inline bool arch_kfence_init_pool(void) > { > return true; > diff --git a/arch/powerpc/include/asm/linkage.h b/arch/powerpc/include/asm/linkage.h > index b88d1d2cf304..46a2ce031844 100644 > --- a/arch/powerpc/include/asm/linkage.h > +++ b/arch/powerpc/include/asm/linkage.h > @@ -7,13 +7,4 @@ > #define __ALIGN .align 2 > #define __ALIGN_STR ".align 2" > > -#ifdef CONFIG_PPC64_ELF_ABI_V1 > -#define cond_syscall(x) \ > - asm ("\t.weak " #x "\n\t.set " #x ", sys_ni_syscall\n" \ > - "\t.weak ." #x "\n\t.set ." #x ", .sys_ni_syscall\n") > -#define SYSCALL_ALIAS(alias, name) \ > - asm ("\t.globl " #alias "\n\t.set " #alias ", " #name "\n" \ > - "\t.globl ." #alias "\n\t.set ." #alias ", ." #name) > -#endif > - > #endif /* _ASM_POWERPC_LINKAGE_H */ > diff --git a/arch/powerpc/include/asm/module.h b/arch/powerpc/include/asm/module.h > index ac53606c2594..ceb21a65e94b 100644 > --- a/arch/powerpc/include/asm/module.h > +++ b/arch/powerpc/include/asm/module.h > @@ -35,9 +35,6 @@ struct mod_arch_specific { > bool toc_fixed; /* Have we fixed up .TOC.? */ > #endif > > - /* For module function descriptor dereference */ > - unsigned long start_opd; > - unsigned long end_opd; > #else /* powerpc64 */ > /* Indices of PLT sections within module. */ > unsigned int core_plt_section; > diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h > index 5f05a984b103..7e845597b5c9 100644 > --- a/arch/powerpc/include/asm/ppc_asm.h > +++ b/arch/powerpc/include/asm/ppc_asm.h > @@ -199,7 +199,7 @@ > #define __STK_REG(i) (112 + ((i)-14)*8) > #define STK_REG(i) __STK_REG(__REG_##i) > > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > +#ifdef CONFIG_PPC64 > #define STK_GOT 24 > #define __STK_PARAM(i) (32 + ((i)-3)*8) > #else > @@ -208,8 +208,6 @@ > #endif > #define STK_PARAM(i) __STK_PARAM(__REG_##i) > > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > - > #define _GLOBAL(name) \ > .align 2 ; \ > .type name,@function; \ > @@ -229,32 +227,6 @@ name: \ > .localentry name,.-name > #endif > > -#define DOTSYM(a) a > - > -#else > - > -#define XGLUE(a,b) a##b > -#define GLUE(a,b) XGLUE(a,b) > - > -#define _GLOBAL(name) \ > - .align 2 ; \ > - .globl name; \ > - .globl GLUE(.,name); \ > - .pushsection ".opd","aw"; \ > -name: \ > - .quad GLUE(.,name); \ > - .quad .TOC.@tocbase; \ > - .quad 0; \ > - .popsection; \ > - .type GLUE(.,name),@function; \ > -GLUE(.,name): > - > -#define _GLOBAL_TOC(name) _GLOBAL(name) > - > -#define DOTSYM(a) GLUE(.,a) > - > -#endif > - > #else /* 32-bit */ > > #define _GLOBAL(n) \ > @@ -263,8 +235,6 @@ GLUE(.,name): > > #define _GLOBAL_TOC(name) _GLOBAL(name) > > -#define DOTSYM(a) a > - > #endif > > /* > @@ -861,11 +831,9 @@ END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96) > #define BTB_FLUSH(reg) > #endif /* CONFIG_PPC_E500 */ > > -#if defined(CONFIG_PPC64_ELF_ABI_V1) > -#define STACK_FRAME_PARAMS 48 > -#elif defined(CONFIG_PPC64_ELF_ABI_V2) > +#ifdef CONFIG_PPC64 > #define STACK_FRAME_PARAMS 32 > -#elif defined(CONFIG_PPC32) > +#else > #define STACK_FRAME_PARAMS 8 > #endif > > diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h > index 0eb90a013346..56517d9b4b99 100644 > --- a/arch/powerpc/include/asm/ptrace.h > +++ b/arch/powerpc/include/asm/ptrace.h > @@ -120,26 +120,15 @@ struct pt_regs > > #define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */ > > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > +/* > + * The kernel always uses the ELFv2 ABI even on big-endian builds > + */ > #define STACK_FRAME_MIN_SIZE 32 > #define STACK_USER_INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_MIN_SIZE + 16) > #define STACK_INT_FRAME_REGS (STACK_FRAME_MIN_SIZE + 16) > #define STACK_INT_FRAME_MARKER STACK_FRAME_MIN_SIZE > #define STACK_SWITCH_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_MIN_SIZE + 16) > #define STACK_SWITCH_FRAME_REGS (STACK_FRAME_MIN_SIZE + 16) > -#else > -/* > - * The ELFv1 ABI specifies 48 bytes plus a minimum 64 byte parameter save > - * area. This parameter area is not used by calls to C from interrupt entry, > - * so the second from last one of those is used for the frame marker. > - */ > -#define STACK_FRAME_MIN_SIZE 112 > -#define STACK_USER_INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_MIN_SIZE) > -#define STACK_INT_FRAME_REGS STACK_FRAME_MIN_SIZE > -#define STACK_INT_FRAME_MARKER (STACK_FRAME_MIN_SIZE - 16) > -#define STACK_SWITCH_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_MIN_SIZE) > -#define STACK_SWITCH_FRAME_REGS STACK_FRAME_MIN_SIZE > -#endif > > /* Size of dummy stack frame allocated when calling signal handler. */ > #define __SIGNAL_FRAMESIZE 128 > diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h > index 4e1f548c8d37..89fd5bba93f5 100644 > --- a/arch/powerpc/include/asm/sections.h > +++ b/arch/powerpc/include/asm/sections.h > @@ -6,10 +6,6 @@ > #include <linux/elf.h> > #include <linux/uaccess.h> > > -#ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS > -typedef struct func_desc func_desc_t; > -#endif > - > #include <asm-generic/sections.h> > > extern char __head_end[]; > diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S > index c33c8ebf8641..281cf280afd5 100644 > --- a/arch/powerpc/kernel/exceptions-64s.S > +++ b/arch/powerpc/kernel/exceptions-64s.S > @@ -1043,7 +1043,7 @@ TRAMP_REAL_BEGIN(system_reset_idle_wake) > /* We are waking up from idle, so may clobber any volatile register */ > cmpwi cr1,r5,2 > bltlr cr1 /* no state loss, return to idle caller with r3=SRR1 */ > - __LOAD_FAR_HANDLER(r12, DOTSYM(idle_return_gpr_loss), real_trampolines) > + __LOAD_FAR_HANDLER(r12, idle_return_gpr_loss, real_trampolines) > mtctr r12 > bctr > #endif > diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c > index ea0a073abd96..2c770c56d500 100644 > --- a/arch/powerpc/kernel/fadump.c > +++ b/arch/powerpc/kernel/fadump.c > @@ -979,10 +979,8 @@ static int fadump_init_elfcore_header(char *bufp) > elf->e_phoff = sizeof(struct elfhdr); > elf->e_shoff = 0; > > - if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2)) > - elf->e_flags = 2; > - else if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V1)) > - elf->e_flags = 1; > + if (IS_ENABLED(CONFIG_PPC64)) > + elf->e_flags = 2; /* PPC64 always uses ELFv2 */ > else > elf->e_flags = 0; > > diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S > index f132d8704263..da7883afdaf5 100644 > --- a/arch/powerpc/kernel/head_64.S > +++ b/arch/powerpc/kernel/head_64.S > @@ -446,9 +446,6 @@ generic_secondary_common_init: > ld r12,CPU_SPEC_RESTORE(r23) > cmpdi 0,r12,0 > beq 3f > -#ifdef CONFIG_PPC64_ELF_ABI_V1 > - ld r12,0(r12) > -#endif > mtctr r12 > bctrl > > @@ -1009,7 +1006,7 @@ start_here_multiplatform: > #endif > /* Restore parameters passed from prom_init/kexec */ > mr r3,r31 > - LOAD_REG_ADDR(r12, DOTSYM(early_setup)) > + LOAD_REG_ADDR(r12, early_setup) > mtctr r12 > bctrl /* also sets r13 and SPRG_PACA */ > > diff --git a/arch/powerpc/kernel/interrupt_64.S b/arch/powerpc/kernel/interrupt_64.S > index bd863702d812..19581e3f4b5f 100644 > --- a/arch/powerpc/kernel/interrupt_64.S > +++ b/arch/powerpc/kernel/interrupt_64.S > @@ -743,9 +743,7 @@ _GLOBAL(ret_from_kernel_user_thread) > bl CFUNC(schedule_tail) > mtctr r14 > mr r3,r15 > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > mr r12,r14 > -#endif > bctrl > li r3,0 > /* > @@ -759,9 +757,7 @@ _GLOBAL(start_kernel_thread) > bl CFUNC(schedule_tail) > mtctr r14 > mr r3,r15 > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > mr r12,r14 > -#endif > bctrl > /* > * This must not return. We actually want to BUG here, not WARN, > diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c > index b20ee72e873a..805a45132060 100644 > --- a/arch/powerpc/kernel/kprobes.c > +++ b/arch/powerpc/kernel/kprobes.c > @@ -45,7 +45,7 @@ kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset) > { > kprobe_opcode_t *addr = NULL; > > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > +#ifdef CONFIG_PPC64 > /* PPC64 ABIv2 needs local entry point */ > addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); > if (addr && !offset) { > @@ -63,41 +63,6 @@ kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset) > #endif > addr = (kprobe_opcode_t *)ppc_function_entry(addr); > } > -#elif defined(CONFIG_PPC64_ELF_ABI_V1) > - /* > - * 64bit powerpc ABIv1 uses function descriptors: > - * - Check for the dot variant of the symbol first. > - * - If that fails, try looking up the symbol provided. > - * > - * This ensures we always get to the actual symbol and not > - * the descriptor. > - * > - * Also handle <module:symbol> format. > - */ > - char dot_name[MODULE_NAME_LEN + 1 + KSYM_NAME_LEN]; > - bool dot_appended = false; > - const char *c; > - ssize_t ret = 0; > - int len = 0; > - > - if ((c = strnchr(name, MODULE_NAME_LEN, ':')) != NULL) { > - c++; > - len = c - name; > - memcpy(dot_name, name, len); > - } else > - c = name; > - > - if (*c != '\0' && *c != '.') { > - dot_name[len++] = '.'; > - dot_appended = true; > - } > - ret = strscpy(dot_name + len, c, KSYM_NAME_LEN); > - if (ret > 0) > - addr = (kprobe_opcode_t *)kallsyms_lookup_name(dot_name); > - > - /* Fallback to the original non-dot symbol lookup */ > - if (!addr && dot_appended) > - addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); > #else > addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); > #endif > @@ -107,7 +72,7 @@ kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset) > > static bool arch_kprobe_on_func_entry(unsigned long offset) > { > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > +#ifdef CONFIG_PPC64 > #ifdef CONFIG_KPROBES_ON_FTRACE > return offset <= 16; > #else > diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S > index 2c9ac70aaf0c..65fa51e46f3e 100644 > --- a/arch/powerpc/kernel/misc_64.S > +++ b/arch/powerpc/kernel/misc_64.S > @@ -456,11 +456,7 @@ _GLOBAL(kexec_sequence) > beq 1f > > /* clear out hardware hash page table and tlb */ > -#ifdef CONFIG_PPC64_ELF_ABI_V1 > - ld r12,0(r27) /* deref function descriptor */ > -#else > mr r12,r27 > -#endif > mtctr r12 > bctrl /* mmu_hash_ops.hpte_clear_all(void); */ > > diff --git a/arch/powerpc/kernel/module.c b/arch/powerpc/kernel/module.c > index f6d6ae0a1692..d145175ed799 100644 > --- a/arch/powerpc/kernel/module.c > +++ b/arch/powerpc/kernel/module.c > @@ -64,14 +64,6 @@ int module_finalize(const Elf_Ehdr *hdr, > (void *)sect->sh_addr + sect->sh_size); > #endif /* CONFIG_PPC64 */ > > -#ifdef CONFIG_PPC64_ELF_ABI_V1 > - sect = find_section(hdr, sechdrs, ".opd"); > - if (sect != NULL) { > - me->arch.start_opd = sect->sh_addr; > - me->arch.end_opd = sect->sh_addr + sect->sh_size; > - } > -#endif /* CONFIG_PPC64_ELF_ABI_V1 */ > - > #ifdef CONFIG_PPC_BARRIER_NOSPEC > sect = find_section(hdr, sechdrs, "__spec_barrier_fixup"); > if (sect != NULL) > diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c > index 92570289ce08..c8e19364a256 100644 > --- a/arch/powerpc/kernel/module_64.c > +++ b/arch/powerpc/kernel/module_64.c > @@ -35,21 +35,7 @@ bool module_elf_check_arch(Elf_Ehdr *hdr) > { > unsigned long abi_level = hdr->e_flags & 0x3; > > - if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2)) > - return abi_level == 2; > - else > - return abi_level < 2; > -} > - > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > - > -static func_desc_t func_desc(unsigned long addr) > -{ > - func_desc_t desc = { > - .addr = addr, > - }; > - > - return desc; > + return abi_level == 2; /* Require ELFv2 */ > } > > /* PowerPC64 specific values for the Elf64_Sym st_other field. */ > @@ -65,36 +51,6 @@ static unsigned int local_entry_offset(const Elf64_Sym *sym) > * of function and try to derive r2 from it). */ > return PPC64_LOCAL_ENTRY_OFFSET(sym->st_other); > } > -#else > - > -static func_desc_t func_desc(unsigned long addr) > -{ > - return *(struct func_desc *)addr; > -} > -static unsigned int local_entry_offset(const Elf64_Sym *sym) > -{ > - return 0; > -} > - > -void *dereference_module_function_descriptor(struct module *mod, void *ptr) > -{ > - if (ptr < (void *)mod->arch.start_opd || > - ptr >= (void *)mod->arch.end_opd) > - return ptr; > - > - return dereference_function_descriptor(ptr); > -} > -#endif > - > -static unsigned long func_addr(unsigned long addr) > -{ > - return func_desc(addr).addr; > -} > - > -static unsigned long stub_func_addr(func_desc_t func) > -{ > - return func.addr; > -} > > #define STUB_MAGIC 0x73747562 /* stub */ > > @@ -111,7 +67,7 @@ struct ppc64_stub_entry { > /* Used by ftrace to identify stubs */ > u32 magic; > /* Data for the above code */ > - func_desc_t funcdata; > + u64 target; > } __aligned(8); > > struct ppc64_got_entry { > @@ -122,8 +78,7 @@ struct ppc64_got_entry { > * PPC64 uses 24 bit jumps, but we need to jump into other modules or > * the kernel which may be further. So we jump to a stub. > * > - * Target address and TOC are loaded from function descriptor in the > - * ppc64_stub_entry. > + * Target address is loaded from target in the ppc64_stub_entry. > * > * r12 is used to generate the target address, which is required for the > * ELFv2 global entry point calling convention. > @@ -132,7 +87,6 @@ struct ppc64_got_entry { > * - PCREL does not have a TOC. > * - ELFv2 non-PCREL just has to save r2, the callee is responsible for > * setting its own TOC pointer at the global entry address. > - * - ELFv1 must load the new TOC pointer from the function descriptor. > */ > static u32 ppc64_stub_insns[] = { > #ifdef CONFIG_PPC_KERNEL_PCREL > @@ -145,10 +99,6 @@ static u32 ppc64_stub_insns[] = { > /* Save current r2 value in magic place on the stack. */ > PPC_RAW_STD(_R2, _R1, R2_STACK_OFFSET), > PPC_RAW_LD(_R12, _R11, 32), > -#ifdef CONFIG_PPC64_ELF_ABI_V1 > - /* Set up new r2 from function descriptor */ > - PPC_RAW_LD(_R2, _R11, 40), > -#endif > #endif > PPC_RAW_MTCTR(_R12), > PPC_RAW_BCTR(), > @@ -535,8 +485,8 @@ static inline int create_ftrace_stub(struct ppc64_stub_entry *entry, > entry->jump[2] |= PPC_LO(reladdr); > } > > - /* Even though we don't use funcdata in the stub, it's needed elsewhere. */ > - entry->funcdata = func_desc(addr); > + /* Even though we don't use target in the stub, it's needed elsewhere. */ > + entry->target = addr; > entry->magic = STUB_MAGIC; > > return 1; > @@ -594,7 +544,6 @@ static inline int create_stub(const Elf64_Shdr *sechdrs, > const char *name) > { > long reladdr; > - func_desc_t desc; > int i; > > if (is_mprofile_ftrace_call(name)) > @@ -614,7 +563,7 @@ static inline int create_stub(const Elf64_Shdr *sechdrs, > > if (IS_ENABLED(CONFIG_PPC_KERNEL_PCREL)) { > /* Stub uses address relative to itself! */ > - reladdr = 0 + offsetof(struct ppc64_stub_entry, funcdata); > + reladdr = 0 + offsetof(struct ppc64_stub_entry, target); > BUILD_BUG_ON(reladdr != 32); > if (reladdr > 0x1FFFFFFFFL || reladdr < -0x200000000L) { > pr_err("%s: Address of %p out of range of 34-bit relative address.\n", > @@ -648,11 +597,10 @@ static inline int create_stub(const Elf64_Shdr *sechdrs, > return 0; > } > > - // func_desc_t is 8 bytes if ABIv2, else 16 bytes > - desc = func_desc(addr); > - for (i = 0; i < sizeof(func_desc_t) / sizeof(u32); i++) { > - if (patch_instruction(((u32 *)&entry->funcdata) + i, > - ppc_inst(((u32 *)(&desc))[i]))) > + // target is 8 bytes > + for (i = 0; i < sizeof(u64) / sizeof(u32); i++) { > + if (patch_instruction(((u32 *)&entry->target) + i, > + ppc_inst(((u32 *)(&addr))[i]))) > return 0; > } > > @@ -676,11 +624,11 @@ static unsigned long stub_for_addr(const Elf64_Shdr *sechdrs, > > /* Find this stub, or if that fails, the next avail. entry */ > stubs = (void *)sechdrs[me->arch.stubs_section].sh_addr; > - for (i = 0; stub_func_addr(stubs[i].funcdata); i++) { > + for (i = 0; stubs[i].target; i++) { > if (WARN_ON(i >= num_stubs)) > return 0; > > - if (stub_func_addr(stubs[i].funcdata) == func_addr(addr)) > + if (stubs[i].target == addr) > return (unsigned long)&stubs[i]; > } > > @@ -1054,7 +1002,6 @@ int module_trampoline_target(struct module *mod, unsigned long addr, > unsigned long *target) > { > struct ppc64_stub_entry *stub; > - func_desc_t funcdata; > u32 magic; > > if (!within_module_core(addr, mod)) { > @@ -1075,14 +1022,11 @@ int module_trampoline_target(struct module *mod, unsigned long addr, > return -EFAULT; > } > > - if (copy_from_kernel_nofault(&funcdata, &stub->funcdata, > - sizeof(funcdata))) { > - pr_err("%s: fault reading funcdata for stub %lx for %s\n", __func__, addr, mod->name); > + if (copy_from_kernel_nofault(target, &stub->target, sizeof(*target))) { > + pr_err("%s: fault reading target for stub %lx for %s\n", __func__, addr, mod->name); > return -EFAULT; > } > > - *target = stub_func_addr(funcdata); > - > return 0; > } > > diff --git a/arch/powerpc/kernel/trace/ftrace.c b/arch/powerpc/kernel/trace/ftrace.c > index a47f30373423..81a121b56c4d 100644 > --- a/arch/powerpc/kernel/trace/ftrace.c > +++ b/arch/powerpc/kernel/trace/ftrace.c > @@ -864,13 +864,3 @@ unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip, > } > #endif > #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ > - > -#ifdef CONFIG_PPC64_ELF_ABI_V1 > -char *arch_ftrace_match_adjust(char *str, const char *search) > -{ > - if (str[0] == '.' && search[0] != '.') > - return str + 1; > - else > - return str; > -} > -#endif /* CONFIG_PPC64_ELF_ABI_V1 */ > diff --git a/arch/powerpc/kernel/vdso/Makefile b/arch/powerpc/kernel/vdso/Makefile > index 4c3f34485f08..d558a2dd9b65 100644 > --- a/arch/powerpc/kernel/vdso/Makefile > +++ b/arch/powerpc/kernel/vdso/Makefile > @@ -15,7 +15,7 @@ ifneq ($(c-gettimeofday-y),) > CFLAGS_vgettimeofday-32.o += -DDISABLE_BRANCH_PROFILING > CFLAGS_vgettimeofday-32.o += -ffreestanding -fasynchronous-unwind-tables > CFLAGS_REMOVE_vgettimeofday-32.o = $(CC_FLAGS_FTRACE) > - CFLAGS_REMOVE_vgettimeofday-32.o += -mcmodel=medium -mabi=elfv1 -mabi=elfv2 -mcall-aixdesc > + CFLAGS_REMOVE_vgettimeofday-32.o += -mcmodel=medium -mabi=elfv2 > # This flag is supported by clang for 64-bit but not 32-bit so it will cause > # an unused command line flag warning for this file. > ifdef CONFIG_CC_IS_CLANG > diff --git a/arch/powerpc/kernel/vdso/gettimeofday.S b/arch/powerpc/kernel/vdso/gettimeofday.S > index 48fc6658053a..88110ec0a5a6 100644 > --- a/arch/powerpc/kernel/vdso/gettimeofday.S > +++ b/arch/powerpc/kernel/vdso/gettimeofday.S > @@ -39,7 +39,7 @@ > addi r4, r5, VDSO_DATA_OFFSET > .endif > #ifdef __powerpc64__ > - bl CFUNC(DOTSYM(\funct)) > + bl CFUNC(\funct) > #else > bl \funct > #endif > diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S > index 13614f0b269c..c3da2dd34691 100644 > --- a/arch/powerpc/kernel/vmlinux.lds.S > +++ b/arch/powerpc/kernel/vmlinux.lds.S > @@ -186,14 +186,6 @@ SECTIONS > SOFT_MASK_TABLE(8) > RESTART_TABLE(8) > > -#ifdef CONFIG_PPC64_ELF_ABI_V1 > - .opd : AT(ADDR(.opd) - LOAD_OFFSET) { > - __start_opd = .; > - KEEP(*(.opd)) > - __end_opd = .; > - } > -#endif > - > . = ALIGN(8); > __stf_entry_barrier_fixup : AT(ADDR(__stf_entry_barrier_fixup) - LOAD_OFFSET) { > __start___stf_entry_barrier_fixup = .; > diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > index 870110e3d9b1..50b3cae5e67d 100644 > --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S > +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > @@ -1790,17 +1790,17 @@ hcall_real_fallback: > .globl hcall_real_table > hcall_real_table: > .long 0 /* 0 - unused */ > - .long DOTSYM(kvmppc_h_remove) - hcall_real_table > - .long DOTSYM(kvmppc_h_enter) - hcall_real_table > - .long DOTSYM(kvmppc_h_read) - hcall_real_table > - .long DOTSYM(kvmppc_h_clear_mod) - hcall_real_table > - .long DOTSYM(kvmppc_h_clear_ref) - hcall_real_table > - .long DOTSYM(kvmppc_h_protect) - hcall_real_table > + .long kvmppc_h_remove - hcall_real_table > + .long kvmppc_h_enter - hcall_real_table > + .long kvmppc_h_read - hcall_real_table > + .long kvmppc_h_clear_mod - hcall_real_table > + .long kvmppc_h_clear_ref - hcall_real_table > + .long kvmppc_h_protect - hcall_real_table > .long 0 /* 0x1c */ > .long 0 /* 0x20 */ > .long 0 /* 0x24 - H_SET_SPRG0 */ > - .long DOTSYM(kvmppc_h_set_dabr) - hcall_real_table > - .long DOTSYM(kvmppc_rm_h_page_init) - hcall_real_table > + .long kvmppc_h_set_dabr - hcall_real_table > + .long kvmppc_rm_h_page_init - hcall_real_table > .long 0 /* 0x30 */ > .long 0 /* 0x34 */ > .long 0 /* 0x38 */ > @@ -1815,11 +1815,11 @@ hcall_real_table: > .long 0 /* 0x5c */ > .long 0 /* 0x60 */ > #ifdef CONFIG_KVM_XICS > - .long DOTSYM(xics_rm_h_eoi) - hcall_real_table > - .long DOTSYM(xics_rm_h_cppr) - hcall_real_table > - .long DOTSYM(xics_rm_h_ipi) - hcall_real_table > + .long xics_rm_h_eoi - hcall_real_table > + .long xics_rm_h_cppr - hcall_real_table > + .long xics_rm_h_ipi - hcall_real_table > .long 0 /* 0x70 - H_IPOLL */ > - .long DOTSYM(xics_rm_h_xirr) - hcall_real_table > + .long xics_rm_h_xirr - hcall_real_table > #else > .long 0 /* 0x64 - H_EOI */ > .long 0 /* 0x68 - H_CPPR */ > @@ -1853,8 +1853,8 @@ hcall_real_table: > .long 0 /* 0xd4 */ > .long 0 /* 0xd8 */ > .long 0 /* 0xdc */ > - .long DOTSYM(kvmppc_h_cede) - hcall_real_table > - .long DOTSYM(kvmppc_rm_h_confer) - hcall_real_table > + .long kvmppc_h_cede - hcall_real_table > + .long kvmppc_rm_h_confer - hcall_real_table > .long 0 /* 0xe8 */ > .long 0 /* 0xec */ > .long 0 /* 0xf0 */ > @@ -1870,11 +1870,11 @@ hcall_real_table: > .long 0 /* 0x118 */ > .long 0 /* 0x11c */ > .long 0 /* 0x120 */ > - .long DOTSYM(kvmppc_h_bulk_remove) - hcall_real_table > + .long kvmppc_h_bulk_remove - hcall_real_table > .long 0 /* 0x128 */ > .long 0 /* 0x12c */ > .long 0 /* 0x130 */ > - .long DOTSYM(kvmppc_h_set_xdabr) - hcall_real_table > + .long kvmppc_h_set_xdabr - hcall_real_table > .long 0 /* 0x138 */ > .long 0 /* 0x13c */ > .long 0 /* 0x140 */ > @@ -1989,11 +1989,11 @@ hcall_real_table: > .long 0 /* 0x2f4 */ > .long 0 /* 0x2f8 */ > #ifdef CONFIG_KVM_XICS > - .long DOTSYM(xics_rm_h_xirr_x) - hcall_real_table > + .long xics_rm_h_xirr_x - hcall_real_table > #else > .long 0 /* 0x2fc - H_XIRR_X*/ > #endif > - .long DOTSYM(kvmppc_rm_h_random) - hcall_real_table > + .long kvmppc_rm_h_random - hcall_real_table > .globl hcall_real_table_end > hcall_real_table_end: > > diff --git a/arch/powerpc/kvm/book3s_interrupts.S b/arch/powerpc/kvm/book3s_interrupts.S > index f4bec2fc51aa..d65d405dabdc 100644 > --- a/arch/powerpc/kvm/book3s_interrupts.S > +++ b/arch/powerpc/kvm/book3s_interrupts.S > @@ -15,15 +15,9 @@ > #include <asm/asm-compat.h> > > #if defined(CONFIG_PPC_BOOK3S_64) > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > -#define FUNC(name) name > -#else > -#define FUNC(name) GLUE(.,name) > -#endif > #define GET_SHADOW_VCPU(reg) addi reg, r13, PACA_SVCPU > > #elif defined(CONFIG_PPC_BOOK3S_32) > -#define FUNC(name) name > #define GET_SHADOW_VCPU(reg) lwz reg, (THREAD + THREAD_KVM_SVCPU)(r2) > > #endif /* CONFIG_PPC_BOOK3S_64 */ > @@ -85,7 +79,7 @@ kvm_start_entry: > > kvm_start_lightweight: > /* Copy registers into shadow vcpu so we can access them in real mode */ > - bl FUNC(kvmppc_copy_to_svcpu) > + bl kvmppc_copy_to_svcpu > nop > REST_GPR(3, r1) > > @@ -123,7 +117,7 @@ after_sprg3_load: > PPC_LL r4, VCPU_SHADOW_MSR(r3) /* get shadow_msr */ > > /* Jump to segment patching handler and into our guest */ > - bl FUNC(kvmppc_entry_trampoline) > + bl kvmppc_entry_trampoline > nop > > /* > @@ -154,7 +148,7 @@ after_sprg3_load: > > /* Transfer reg values from shadow vcpu back to vcpu struct */ > > - bl FUNC(kvmppc_copy_from_svcpu) > + bl kvmppc_copy_from_svcpu > nop > > #ifdef CONFIG_PPC_BOOK3S_64 > @@ -193,7 +187,7 @@ after_sprg3_load: > > /* Restore r3 (vcpu) */ > REST_GPR(3, r1) > - bl FUNC(kvmppc_handle_exit_pr) > + bl kvmppc_handle_exit_pr > > /* If RESUME_GUEST, get back in the loop */ > cmpwi r3, RESUME_GUEST > diff --git a/arch/powerpc/kvm/book3s_rmhandlers.S b/arch/powerpc/kvm/book3s_rmhandlers.S > index 0a557ffca9fe..415802bedfdf 100644 > --- a/arch/powerpc/kvm/book3s_rmhandlers.S > +++ b/arch/powerpc/kvm/book3s_rmhandlers.S > @@ -24,17 +24,7 @@ > * * > ****************************************************************************/ > > -#if defined(CONFIG_PPC_BOOK3S_64) > - > -#ifdef CONFIG_PPC64_ELF_ABI_V2 > -#define FUNC(name) name > -#else > -#define FUNC(name) GLUE(.,name) > -#endif > - > -#elif defined(CONFIG_PPC_BOOK3S_32) > - > -#define FUNC(name) name > +#if defined(CONFIG_PPC_BOOK3S_32) > > #define RFI_TO_KERNEL rfi > #define RFI_TO_GUEST rfi > diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h > index 72b7bb34fade..65f1b80ae589 100644 > --- a/arch/powerpc/net/bpf_jit.h > +++ b/arch/powerpc/net/bpf_jit.h > @@ -13,12 +13,6 @@ > #include <asm/types.h> > #include <asm/ppc-opcode.h> > > -#ifdef CONFIG_PPC64_ELF_ABI_V1 > -#define FUNCTION_DESCR_SIZE 24 > -#else > -#define FUNCTION_DESCR_SIZE 0 > -#endif > - > #define CTX_NIA(ctx) ((unsigned long)ctx->idx * 4) > > #define PLANT_INSTR(d, idx, instr) \ > diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c > index e93aefcfb83f..dec3119e2bdb 100644 > --- a/arch/powerpc/net/bpf_jit_comp.c > +++ b/arch/powerpc/net/bpf_jit_comp.c > @@ -152,7 +152,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp) > extable_len = fp->aux->num_exentries * sizeof(struct exception_table_entry); > > proglen = cgctx.idx * 4; > - alloclen = proglen + FUNCTION_DESCR_SIZE + fixup_len + extable_len; > + alloclen = proglen + fixup_len + extable_len; > > bpf_hdr = bpf_jit_binary_alloc(alloclen, &image, 4, bpf_jit_fill_ill_insns); > if (!bpf_hdr) { > @@ -161,10 +161,10 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp) > } > > if (extable_len) > - fp->aux->extable = (void *)image + FUNCTION_DESCR_SIZE + proglen + fixup_len; > + fp->aux->extable = (void *)image + proglen + fixup_len; > > skip_init_ctx: > - code_base = (u32 *)(image + FUNCTION_DESCR_SIZE); > + code_base = (u32 *)image; > > /* Code generation passes 1-2 */ > for (pass = 1; pass < 3; pass++) { > @@ -191,15 +191,9 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp) > */ > bpf_jit_dump(flen, proglen, pass, code_base); > > -#ifdef CONFIG_PPC64_ELF_ABI_V1 > - /* Function descriptor nastiness: Address + TOC */ > - ((u64 *)image)[0] = (u64)code_base; > - ((u64 *)image)[1] = local_paca->kernel_toc; > -#endif > - > fp->bpf_func = (void *)image; > fp->jited = 1; > - fp->jited_len = proglen + FUNCTION_DESCR_SIZE; > + fp->jited_len = proglen; > > bpf_flush_icache(bpf_hdr, (u8 *)bpf_hdr + bpf_hdr->size); > if (!fp->is_func || extra_pass) { > diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c > index 0f8048f6dad6..4a5cc7acf21e 100644 > --- a/arch/powerpc/net/bpf_jit_comp64.c > +++ b/arch/powerpc/net/bpf_jit_comp64.c > @@ -127,8 +127,7 @@ void bpf_jit_build_prologue(u32 *image, struct codegen_context *ctx) > int i; > > #ifndef CONFIG_PPC_KERNEL_PCREL > - if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2)) > - EMIT(PPC_RAW_LD(_R2, _R13, offsetof(struct paca_struct, kernel_toc))); > + EMIT(PPC_RAW_LD(_R2, _R13, offsetof(struct paca_struct, kernel_toc))); > #endif > > /* > @@ -247,9 +246,6 @@ int bpf_jit_emit_func_call_rel(u32 *image, struct codegen_context *ctx, u64 func > if (WARN_ON_ONCE(func && is_module_text_address(func))) > return -EINVAL; > > - /* skip past descriptor if elf v1 */ > - func += FUNCTION_DESCR_SIZE; > - > /* Load function address into r12 */ > PPC_LI64(_R12, func); > > @@ -285,8 +281,7 @@ static int bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 o > int b2p_index = bpf_to_ppc(BPF_REG_3); > int bpf_tailcall_prologue_size = 8; > > - if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2)) > - bpf_tailcall_prologue_size += 4; /* skip past the toc load */ > + bpf_tailcall_prologue_size += 4; /* skip past the toc load */ > > /* > * if (index >= array->map.max_entries) > @@ -326,7 +321,7 @@ static int bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 o > /* goto *(prog->bpf_func + prologue_size); */ > EMIT(PPC_RAW_LD(bpf_to_ppc(TMP_REG_1), bpf_to_ppc(TMP_REG_1), offsetof(struct bpf_prog, bpf_func))); > EMIT(PPC_RAW_ADDI(bpf_to_ppc(TMP_REG_1), bpf_to_ppc(TMP_REG_1), > - FUNCTION_DESCR_SIZE + bpf_tailcall_prologue_size)); > + bpf_tailcall_prologue_size)); > EMIT(PPC_RAW_MTCTR(bpf_to_ppc(TMP_REG_1))); > > /* tear down stack, restore NVRs, ... */ > @@ -743,7 +738,7 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, struct codegen_context * > break; > case STF_BARRIER_FALLBACK: > ctx->seen |= SEEN_FUNC; > - PPC_LI64(_R12, dereference_kernel_function_descriptor(bpf_stf_barrier)); > + PPC_LI64(_R12, bpf_stf_barrier); > EMIT(PPC_RAW_MTCTR(_R12)); > EMIT(PPC_RAW_BCTRL()); > break; > diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype > index 45fd975ef521..51d00f5aadc7 100644 > --- a/arch/powerpc/platforms/Kconfig.cputype > +++ b/arch/powerpc/platforms/Kconfig.cputype > @@ -627,12 +627,6 @@ config CPU_LITTLE_ENDIAN > > endchoice > > -config PPC64_ELF_ABI_V1 > - def_bool PPC64 && (CPU_BIG_ENDIAN && !PPC64_BIG_ENDIAN_ELF_ABI_V2) > - > -config PPC64_ELF_ABI_V2 > - def_bool PPC64 && !PPC64_ELF_ABI_V1 > - > config PPC64_BOOT_WRAPPER > def_bool n > depends on CPU_LITTLE_ENDIAN > diff --git a/drivers/crypto/vmx/Makefile b/drivers/crypto/vmx/Makefile > index 7257b8c44626..8e7e559d6098 100644 > --- a/drivers/crypto/vmx/Makefile > +++ b/drivers/crypto/vmx/Makefile > @@ -5,11 +5,7 @@ vmx-crypto-objs := vmx.o aesp8-ppc.o ghashp8-ppc.o aes.o aes_cbc.o aes_ctr.o aes > ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y) > override flavour := linux-ppc64le > else > -ifdef CONFIG_PPC64_ELF_ABI_V2 > override flavour := linux-ppc64-elfv2 > -else > -override flavour := linux-ppc64 > -endif > endif > > quiet_cmd_perl = PERL $@ > diff --git a/kernel/extable.c b/kernel/extable.c > index 71f482581cab..3b559b2d55a9 100644 > --- a/kernel/extable.c > +++ b/kernel/extable.c > @@ -133,7 +133,7 @@ int kernel_text_address(unsigned long addr) > } > > /* > - * On some architectures (PPC64, IA64, PARISC) function pointers > + * On some architectures (IA64, PARISC) function pointers > * are actually only tokens to some data that then holds the > * real function address. As a result, to find if a function > * pointer is part of the kernel text, we need to do some > diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c > index 76973a70ab9d..d50ca738d408 100644 > --- a/kernel/trace/ftrace.c > +++ b/kernel/trace/ftrace.c > @@ -4122,23 +4122,11 @@ struct ftrace_glob { > int type; > }; > > -/* > - * If symbols in an architecture don't correspond exactly to the user-visible > - * name of what they represent, it is possible to define this function to > - * perform the necessary adjustments. > -*/ > -char * __weak arch_ftrace_match_adjust(char *str, const char *search) > -{ > - return str; > -} > - > static int ftrace_match(char *str, struct ftrace_glob *g) > { > int matched = 0; > int slen; > > - str = arch_ftrace_match_adjust(str, g->search); > - > switch (g->type) { > case MATCH_FULL: > if (strcmp(str, g->search) == 0)
On Fri May 5, 2023 at 6:49 PM AEST, Christophe Leroy wrote: > > > Le 05/05/2023 à 09:18, Nicholas Piggin a écrit : > > User code must still support ELFv1, e.g., see is_elf2_task(). > > > > This one should wait a while until ELFv2 fallout settles, so > > just posting it out of interest. > > Can't ELFv1 user code run on an ELFv2 kernel ? Yes it can and that's what ELFv2 BE kernels do because most BE userspace is ELFv1 (although some are using ELFv2 BE). By ELFv2 fallout I mean bugs and toolchain problems that might get discovered after we flip the default. I think it would be good to keep the ELFv1 option around for a few releases to help testing such issues, the revert will probably pick up conflicts. Maybe that's being too paranoid. Thanks, Nick
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index a64bfd9b8a1d..6cbcaf1d01a6 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -1,9 +1,6 @@ # SPDX-License-Identifier: GPL-2.0 source "arch/powerpc/platforms/Kconfig.cputype" -config CC_HAS_ELFV2 - def_bool PPC64 && $(cc-option, -mabi=elfv2) - config CC_HAS_PREFIXED def_bool PPC64 && $(cc-option, -mcpu=power10 -mprefixed) @@ -232,7 +229,6 @@ config PPC select HAVE_EFFICIENT_UNALIGNED_ACCESS select HAVE_FAST_GUP select HAVE_FTRACE_MCOUNT_RECORD - select HAVE_FUNCTION_DESCRIPTORS if PPC64_ELF_ABI_V1 select HAVE_FUNCTION_ERROR_INJECTION select HAVE_FUNCTION_GRAPH_TRACER select HAVE_FUNCTION_TRACER @@ -623,21 +619,6 @@ config KEXEC_FILE config ARCH_HAS_KEXEC_PURGATORY def_bool KEXEC_FILE -config PPC64_BIG_ENDIAN_ELF_ABI_V2 - prompt "Build big-endian kernel using ELF ABI V2" if LD_IS_BFD && EXPERT - def_bool y - depends on PPC64 && CPU_BIG_ENDIAN - depends on CC_HAS_ELFV2 - help - This builds the kernel image using the "Power Architecture 64-Bit ELF - V2 ABI Specification", which has a reduced stack overhead and faster - function calls. This internal kernel ABI option does not affect - userspace compatibility. - - The V2 ABI is standard for 64-bit little-endian, but for big-endian - it is less well tested by kernel and toolchain. However some distros - build userspace this way, and it can produce a functioning kernel. - config RELOCATABLE bool "Build a relocatable kernel" depends on PPC64 || (FLATMEM && (44x || PPC_85xx)) diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile index dca73f673d70..8ddc779e675f 100644 --- a/arch/powerpc/Makefile +++ b/arch/powerpc/Makefile @@ -72,10 +72,8 @@ endif ifdef CONFIG_PPC64 ifndef CONFIG_CC_IS_CLANG -cflags-$(CONFIG_PPC64_ELF_ABI_V1) += $(call cc-option,-mabi=elfv1) -cflags-$(CONFIG_PPC64_ELF_ABI_V1) += $(call cc-option,-mcall-aixdesc) -aflags-$(CONFIG_PPC64_ELF_ABI_V1) += $(call cc-option,-mabi=elfv1) -aflags-$(CONFIG_PPC64_ELF_ABI_V2) += -mabi=elfv2 +#Is this even needed? +aflags-y += -mabi=elfv2 endif endif @@ -125,14 +123,7 @@ endif endif CFLAGS-$(CONFIG_PPC64) := $(call cc-option,-mtraceback=no) -ifdef CONFIG_PPC64_ELF_ABI_V2 -CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv2,$(call cc-option,-mcall-aixdesc)) -else -ifndef CONFIG_CC_IS_CLANG -CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mabi=elfv1) -CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcall-aixdesc) -endif -endif +CFLAGS-$(CONFIG_PPC64) += -mabi=elfv2 CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,$(call cc-option,-mminimal-toc)) CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mno-pointers-to-nested-functions) CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mlong-double-128) diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile index 85cde5bf04b7..e6979f4ea571 100644 --- a/arch/powerpc/boot/Makefile +++ b/arch/powerpc/boot/Makefile @@ -42,9 +42,7 @@ BOOTCFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \ ifdef CONFIG_PPC64_BOOT_WRAPPER BOOTCFLAGS += -m64 -ifdef CONFIG_PPC64_ELF_ABI_V2 -BOOTCFLAGS += $(call cc-option,-mabi=elfv2) -endif +BOOTCFLAGS += -mabi=elfv2 else BOOTCFLAGS += -m32 endif diff --git a/arch/powerpc/include/asm/code-patching.h b/arch/powerpc/include/asm/code-patching.h index 3f881548fb61..90508151e5f4 100644 --- a/arch/powerpc/include/asm/code-patching.h +++ b/arch/powerpc/include/asm/code-patching.h @@ -130,7 +130,7 @@ bool is_conditional_branch(ppc_inst_t instr); static inline unsigned long ppc_function_entry(void *func) { -#ifdef CONFIG_PPC64_ELF_ABI_V2 +#ifdef CONFIG_PPC64 u32 *insn = func; /* @@ -155,13 +155,6 @@ static inline unsigned long ppc_function_entry(void *func) return (unsigned long)(insn + 2); else return (unsigned long)func; -#elif defined(CONFIG_PPC64_ELF_ABI_V1) - /* - * On PPC64 ABIv1 the function pointer actually points to the - * function's descriptor. The first entry in the descriptor is the - * address of the function text. - */ - return ((struct func_desc *)func)->addr; #else return (unsigned long)func; #endif @@ -169,7 +162,7 @@ static inline unsigned long ppc_function_entry(void *func) static inline unsigned long ppc_global_function_entry(void *func) { -#ifdef CONFIG_PPC64_ELF_ABI_V2 +#ifdef CONFIG_PPC64 /* PPC64 ABIv2 the global entry point is at the address */ return (unsigned long)func; #else @@ -186,28 +179,7 @@ static inline unsigned long ppc_global_function_entry(void *func) static inline unsigned long ppc_kallsyms_lookup_name(const char *name) { unsigned long addr; -#ifdef CONFIG_PPC64_ELF_ABI_V1 - /* check for dot variant */ - char dot_name[1 + KSYM_NAME_LEN]; - bool dot_appended = false; - - if (strnlen(name, KSYM_NAME_LEN) >= KSYM_NAME_LEN) - return 0; - - if (name[0] != '.') { - dot_name[0] = '.'; - dot_name[1] = '\0'; - strlcat(dot_name, name, sizeof(dot_name)); - dot_appended = true; - } else { - dot_name[0] = '\0'; - strlcat(dot_name, name, sizeof(dot_name)); - } - addr = kallsyms_lookup_name(dot_name); - if (!addr && dot_appended) - /* Let's try the original non-dot symbol lookup */ - addr = kallsyms_lookup_name(name); -#elif defined(CONFIG_PPC64_ELF_ABI_V2) +#ifdef CONFIG_PPC64 addr = kallsyms_lookup_name(name); if (addr) addr = ppc_function_entry((void *)addr); @@ -223,7 +195,7 @@ static inline unsigned long ppc_kallsyms_lookup_name(const char *name) */ /* This must match the definition of STK_GOT in <asm/ppc_asm.h> */ -#ifdef CONFIG_PPC64_ELF_ABI_V2 +#ifdef CONFIG_PPC64 #define R2_STACK_OFFSET 24 #else #define R2_STACK_OFFSET 40 diff --git a/arch/powerpc/include/asm/kfence.h b/arch/powerpc/include/asm/kfence.h index 6fd2b4d486c5..5e79b69b2764 100644 --- a/arch/powerpc/include/asm/kfence.h +++ b/arch/powerpc/include/asm/kfence.h @@ -11,10 +11,6 @@ #include <linux/mm.h> #include <asm/pgtable.h> -#ifdef CONFIG_PPC64_ELF_ABI_V1 -#define ARCH_FUNC_PREFIX "." -#endif - static inline bool arch_kfence_init_pool(void) { return true; diff --git a/arch/powerpc/include/asm/linkage.h b/arch/powerpc/include/asm/linkage.h index b88d1d2cf304..46a2ce031844 100644 --- a/arch/powerpc/include/asm/linkage.h +++ b/arch/powerpc/include/asm/linkage.h @@ -7,13 +7,4 @@ #define __ALIGN .align 2 #define __ALIGN_STR ".align 2" -#ifdef CONFIG_PPC64_ELF_ABI_V1 -#define cond_syscall(x) \ - asm ("\t.weak " #x "\n\t.set " #x ", sys_ni_syscall\n" \ - "\t.weak ." #x "\n\t.set ." #x ", .sys_ni_syscall\n") -#define SYSCALL_ALIAS(alias, name) \ - asm ("\t.globl " #alias "\n\t.set " #alias ", " #name "\n" \ - "\t.globl ." #alias "\n\t.set ." #alias ", ." #name) -#endif - #endif /* _ASM_POWERPC_LINKAGE_H */ diff --git a/arch/powerpc/include/asm/module.h b/arch/powerpc/include/asm/module.h index ac53606c2594..ceb21a65e94b 100644 --- a/arch/powerpc/include/asm/module.h +++ b/arch/powerpc/include/asm/module.h @@ -35,9 +35,6 @@ struct mod_arch_specific { bool toc_fixed; /* Have we fixed up .TOC.? */ #endif - /* For module function descriptor dereference */ - unsigned long start_opd; - unsigned long end_opd; #else /* powerpc64 */ /* Indices of PLT sections within module. */ unsigned int core_plt_section; diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index 5f05a984b103..7e845597b5c9 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h @@ -199,7 +199,7 @@ #define __STK_REG(i) (112 + ((i)-14)*8) #define STK_REG(i) __STK_REG(__REG_##i) -#ifdef CONFIG_PPC64_ELF_ABI_V2 +#ifdef CONFIG_PPC64 #define STK_GOT 24 #define __STK_PARAM(i) (32 + ((i)-3)*8) #else @@ -208,8 +208,6 @@ #endif #define STK_PARAM(i) __STK_PARAM(__REG_##i) -#ifdef CONFIG_PPC64_ELF_ABI_V2 - #define _GLOBAL(name) \ .align 2 ; \ .type name,@function; \ @@ -229,32 +227,6 @@ name: \ .localentry name,.-name #endif -#define DOTSYM(a) a - -#else - -#define XGLUE(a,b) a##b -#define GLUE(a,b) XGLUE(a,b) - -#define _GLOBAL(name) \ - .align 2 ; \ - .globl name; \ - .globl GLUE(.,name); \ - .pushsection ".opd","aw"; \ -name: \ - .quad GLUE(.,name); \ - .quad .TOC.@tocbase; \ - .quad 0; \ - .popsection; \ - .type GLUE(.,name),@function; \ -GLUE(.,name): - -#define _GLOBAL_TOC(name) _GLOBAL(name) - -#define DOTSYM(a) GLUE(.,a) - -#endif - #else /* 32-bit */ #define _GLOBAL(n) \ @@ -263,8 +235,6 @@ GLUE(.,name): #define _GLOBAL_TOC(name) _GLOBAL(name) -#define DOTSYM(a) a - #endif /* @@ -861,11 +831,9 @@ END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96) #define BTB_FLUSH(reg) #endif /* CONFIG_PPC_E500 */ -#if defined(CONFIG_PPC64_ELF_ABI_V1) -#define STACK_FRAME_PARAMS 48 -#elif defined(CONFIG_PPC64_ELF_ABI_V2) +#ifdef CONFIG_PPC64 #define STACK_FRAME_PARAMS 32 -#elif defined(CONFIG_PPC32) +#else #define STACK_FRAME_PARAMS 8 #endif diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h index 0eb90a013346..56517d9b4b99 100644 --- a/arch/powerpc/include/asm/ptrace.h +++ b/arch/powerpc/include/asm/ptrace.h @@ -120,26 +120,15 @@ struct pt_regs #define STACK_FRAME_LR_SAVE 2 /* Location of LR in stack frame */ -#ifdef CONFIG_PPC64_ELF_ABI_V2 +/* + * The kernel always uses the ELFv2 ABI even on big-endian builds + */ #define STACK_FRAME_MIN_SIZE 32 #define STACK_USER_INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_MIN_SIZE + 16) #define STACK_INT_FRAME_REGS (STACK_FRAME_MIN_SIZE + 16) #define STACK_INT_FRAME_MARKER STACK_FRAME_MIN_SIZE #define STACK_SWITCH_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_MIN_SIZE + 16) #define STACK_SWITCH_FRAME_REGS (STACK_FRAME_MIN_SIZE + 16) -#else -/* - * The ELFv1 ABI specifies 48 bytes plus a minimum 64 byte parameter save - * area. This parameter area is not used by calls to C from interrupt entry, - * so the second from last one of those is used for the frame marker. - */ -#define STACK_FRAME_MIN_SIZE 112 -#define STACK_USER_INT_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_MIN_SIZE) -#define STACK_INT_FRAME_REGS STACK_FRAME_MIN_SIZE -#define STACK_INT_FRAME_MARKER (STACK_FRAME_MIN_SIZE - 16) -#define STACK_SWITCH_FRAME_SIZE (sizeof(struct pt_regs) + STACK_FRAME_MIN_SIZE) -#define STACK_SWITCH_FRAME_REGS STACK_FRAME_MIN_SIZE -#endif /* Size of dummy stack frame allocated when calling signal handler. */ #define __SIGNAL_FRAMESIZE 128 diff --git a/arch/powerpc/include/asm/sections.h b/arch/powerpc/include/asm/sections.h index 4e1f548c8d37..89fd5bba93f5 100644 --- a/arch/powerpc/include/asm/sections.h +++ b/arch/powerpc/include/asm/sections.h @@ -6,10 +6,6 @@ #include <linux/elf.h> #include <linux/uaccess.h> -#ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS -typedef struct func_desc func_desc_t; -#endif - #include <asm-generic/sections.h> extern char __head_end[]; diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index c33c8ebf8641..281cf280afd5 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S @@ -1043,7 +1043,7 @@ TRAMP_REAL_BEGIN(system_reset_idle_wake) /* We are waking up from idle, so may clobber any volatile register */ cmpwi cr1,r5,2 bltlr cr1 /* no state loss, return to idle caller with r3=SRR1 */ - __LOAD_FAR_HANDLER(r12, DOTSYM(idle_return_gpr_loss), real_trampolines) + __LOAD_FAR_HANDLER(r12, idle_return_gpr_loss, real_trampolines) mtctr r12 bctr #endif diff --git a/arch/powerpc/kernel/fadump.c b/arch/powerpc/kernel/fadump.c index ea0a073abd96..2c770c56d500 100644 --- a/arch/powerpc/kernel/fadump.c +++ b/arch/powerpc/kernel/fadump.c @@ -979,10 +979,8 @@ static int fadump_init_elfcore_header(char *bufp) elf->e_phoff = sizeof(struct elfhdr); elf->e_shoff = 0; - if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2)) - elf->e_flags = 2; - else if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V1)) - elf->e_flags = 1; + if (IS_ENABLED(CONFIG_PPC64)) + elf->e_flags = 2; /* PPC64 always uses ELFv2 */ else elf->e_flags = 0; diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index f132d8704263..da7883afdaf5 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S @@ -446,9 +446,6 @@ generic_secondary_common_init: ld r12,CPU_SPEC_RESTORE(r23) cmpdi 0,r12,0 beq 3f -#ifdef CONFIG_PPC64_ELF_ABI_V1 - ld r12,0(r12) -#endif mtctr r12 bctrl @@ -1009,7 +1006,7 @@ start_here_multiplatform: #endif /* Restore parameters passed from prom_init/kexec */ mr r3,r31 - LOAD_REG_ADDR(r12, DOTSYM(early_setup)) + LOAD_REG_ADDR(r12, early_setup) mtctr r12 bctrl /* also sets r13 and SPRG_PACA */ diff --git a/arch/powerpc/kernel/interrupt_64.S b/arch/powerpc/kernel/interrupt_64.S index bd863702d812..19581e3f4b5f 100644 --- a/arch/powerpc/kernel/interrupt_64.S +++ b/arch/powerpc/kernel/interrupt_64.S @@ -743,9 +743,7 @@ _GLOBAL(ret_from_kernel_user_thread) bl CFUNC(schedule_tail) mtctr r14 mr r3,r15 -#ifdef CONFIG_PPC64_ELF_ABI_V2 mr r12,r14 -#endif bctrl li r3,0 /* @@ -759,9 +757,7 @@ _GLOBAL(start_kernel_thread) bl CFUNC(schedule_tail) mtctr r14 mr r3,r15 -#ifdef CONFIG_PPC64_ELF_ABI_V2 mr r12,r14 -#endif bctrl /* * This must not return. We actually want to BUG here, not WARN, diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c index b20ee72e873a..805a45132060 100644 --- a/arch/powerpc/kernel/kprobes.c +++ b/arch/powerpc/kernel/kprobes.c @@ -45,7 +45,7 @@ kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset) { kprobe_opcode_t *addr = NULL; -#ifdef CONFIG_PPC64_ELF_ABI_V2 +#ifdef CONFIG_PPC64 /* PPC64 ABIv2 needs local entry point */ addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); if (addr && !offset) { @@ -63,41 +63,6 @@ kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset) #endif addr = (kprobe_opcode_t *)ppc_function_entry(addr); } -#elif defined(CONFIG_PPC64_ELF_ABI_V1) - /* - * 64bit powerpc ABIv1 uses function descriptors: - * - Check for the dot variant of the symbol first. - * - If that fails, try looking up the symbol provided. - * - * This ensures we always get to the actual symbol and not - * the descriptor. - * - * Also handle <module:symbol> format. - */ - char dot_name[MODULE_NAME_LEN + 1 + KSYM_NAME_LEN]; - bool dot_appended = false; - const char *c; - ssize_t ret = 0; - int len = 0; - - if ((c = strnchr(name, MODULE_NAME_LEN, ':')) != NULL) { - c++; - len = c - name; - memcpy(dot_name, name, len); - } else - c = name; - - if (*c != '\0' && *c != '.') { - dot_name[len++] = '.'; - dot_appended = true; - } - ret = strscpy(dot_name + len, c, KSYM_NAME_LEN); - if (ret > 0) - addr = (kprobe_opcode_t *)kallsyms_lookup_name(dot_name); - - /* Fallback to the original non-dot symbol lookup */ - if (!addr && dot_appended) - addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); #else addr = (kprobe_opcode_t *)kallsyms_lookup_name(name); #endif @@ -107,7 +72,7 @@ kprobe_opcode_t *kprobe_lookup_name(const char *name, unsigned int offset) static bool arch_kprobe_on_func_entry(unsigned long offset) { -#ifdef CONFIG_PPC64_ELF_ABI_V2 +#ifdef CONFIG_PPC64 #ifdef CONFIG_KPROBES_ON_FTRACE return offset <= 16; #else diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index 2c9ac70aaf0c..65fa51e46f3e 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S @@ -456,11 +456,7 @@ _GLOBAL(kexec_sequence) beq 1f /* clear out hardware hash page table and tlb */ -#ifdef CONFIG_PPC64_ELF_ABI_V1 - ld r12,0(r27) /* deref function descriptor */ -#else mr r12,r27 -#endif mtctr r12 bctrl /* mmu_hash_ops.hpte_clear_all(void); */ diff --git a/arch/powerpc/kernel/module.c b/arch/powerpc/kernel/module.c index f6d6ae0a1692..d145175ed799 100644 --- a/arch/powerpc/kernel/module.c +++ b/arch/powerpc/kernel/module.c @@ -64,14 +64,6 @@ int module_finalize(const Elf_Ehdr *hdr, (void *)sect->sh_addr + sect->sh_size); #endif /* CONFIG_PPC64 */ -#ifdef CONFIG_PPC64_ELF_ABI_V1 - sect = find_section(hdr, sechdrs, ".opd"); - if (sect != NULL) { - me->arch.start_opd = sect->sh_addr; - me->arch.end_opd = sect->sh_addr + sect->sh_size; - } -#endif /* CONFIG_PPC64_ELF_ABI_V1 */ - #ifdef CONFIG_PPC_BARRIER_NOSPEC sect = find_section(hdr, sechdrs, "__spec_barrier_fixup"); if (sect != NULL) diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index 92570289ce08..c8e19364a256 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c @@ -35,21 +35,7 @@ bool module_elf_check_arch(Elf_Ehdr *hdr) { unsigned long abi_level = hdr->e_flags & 0x3; - if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2)) - return abi_level == 2; - else - return abi_level < 2; -} - -#ifdef CONFIG_PPC64_ELF_ABI_V2 - -static func_desc_t func_desc(unsigned long addr) -{ - func_desc_t desc = { - .addr = addr, - }; - - return desc; + return abi_level == 2; /* Require ELFv2 */ } /* PowerPC64 specific values for the Elf64_Sym st_other field. */ @@ -65,36 +51,6 @@ static unsigned int local_entry_offset(const Elf64_Sym *sym) * of function and try to derive r2 from it). */ return PPC64_LOCAL_ENTRY_OFFSET(sym->st_other); } -#else - -static func_desc_t func_desc(unsigned long addr) -{ - return *(struct func_desc *)addr; -} -static unsigned int local_entry_offset(const Elf64_Sym *sym) -{ - return 0; -} - -void *dereference_module_function_descriptor(struct module *mod, void *ptr) -{ - if (ptr < (void *)mod->arch.start_opd || - ptr >= (void *)mod->arch.end_opd) - return ptr; - - return dereference_function_descriptor(ptr); -} -#endif - -static unsigned long func_addr(unsigned long addr) -{ - return func_desc(addr).addr; -} - -static unsigned long stub_func_addr(func_desc_t func) -{ - return func.addr; -} #define STUB_MAGIC 0x73747562 /* stub */ @@ -111,7 +67,7 @@ struct ppc64_stub_entry { /* Used by ftrace to identify stubs */ u32 magic; /* Data for the above code */ - func_desc_t funcdata; + u64 target; } __aligned(8); struct ppc64_got_entry { @@ -122,8 +78,7 @@ struct ppc64_got_entry { * PPC64 uses 24 bit jumps, but we need to jump into other modules or * the kernel which may be further. So we jump to a stub. * - * Target address and TOC are loaded from function descriptor in the - * ppc64_stub_entry. + * Target address is loaded from target in the ppc64_stub_entry. * * r12 is used to generate the target address, which is required for the * ELFv2 global entry point calling convention. @@ -132,7 +87,6 @@ struct ppc64_got_entry { * - PCREL does not have a TOC. * - ELFv2 non-PCREL just has to save r2, the callee is responsible for * setting its own TOC pointer at the global entry address. - * - ELFv1 must load the new TOC pointer from the function descriptor. */ static u32 ppc64_stub_insns[] = { #ifdef CONFIG_PPC_KERNEL_PCREL @@ -145,10 +99,6 @@ static u32 ppc64_stub_insns[] = { /* Save current r2 value in magic place on the stack. */ PPC_RAW_STD(_R2, _R1, R2_STACK_OFFSET), PPC_RAW_LD(_R12, _R11, 32), -#ifdef CONFIG_PPC64_ELF_ABI_V1 - /* Set up new r2 from function descriptor */ - PPC_RAW_LD(_R2, _R11, 40), -#endif #endif PPC_RAW_MTCTR(_R12), PPC_RAW_BCTR(), @@ -535,8 +485,8 @@ static inline int create_ftrace_stub(struct ppc64_stub_entry *entry, entry->jump[2] |= PPC_LO(reladdr); } - /* Even though we don't use funcdata in the stub, it's needed elsewhere. */ - entry->funcdata = func_desc(addr); + /* Even though we don't use target in the stub, it's needed elsewhere. */ + entry->target = addr; entry->magic = STUB_MAGIC; return 1; @@ -594,7 +544,6 @@ static inline int create_stub(const Elf64_Shdr *sechdrs, const char *name) { long reladdr; - func_desc_t desc; int i; if (is_mprofile_ftrace_call(name)) @@ -614,7 +563,7 @@ static inline int create_stub(const Elf64_Shdr *sechdrs, if (IS_ENABLED(CONFIG_PPC_KERNEL_PCREL)) { /* Stub uses address relative to itself! */ - reladdr = 0 + offsetof(struct ppc64_stub_entry, funcdata); + reladdr = 0 + offsetof(struct ppc64_stub_entry, target); BUILD_BUG_ON(reladdr != 32); if (reladdr > 0x1FFFFFFFFL || reladdr < -0x200000000L) { pr_err("%s: Address of %p out of range of 34-bit relative address.\n", @@ -648,11 +597,10 @@ static inline int create_stub(const Elf64_Shdr *sechdrs, return 0; } - // func_desc_t is 8 bytes if ABIv2, else 16 bytes - desc = func_desc(addr); - for (i = 0; i < sizeof(func_desc_t) / sizeof(u32); i++) { - if (patch_instruction(((u32 *)&entry->funcdata) + i, - ppc_inst(((u32 *)(&desc))[i]))) + // target is 8 bytes + for (i = 0; i < sizeof(u64) / sizeof(u32); i++) { + if (patch_instruction(((u32 *)&entry->target) + i, + ppc_inst(((u32 *)(&addr))[i]))) return 0; } @@ -676,11 +624,11 @@ static unsigned long stub_for_addr(const Elf64_Shdr *sechdrs, /* Find this stub, or if that fails, the next avail. entry */ stubs = (void *)sechdrs[me->arch.stubs_section].sh_addr; - for (i = 0; stub_func_addr(stubs[i].funcdata); i++) { + for (i = 0; stubs[i].target; i++) { if (WARN_ON(i >= num_stubs)) return 0; - if (stub_func_addr(stubs[i].funcdata) == func_addr(addr)) + if (stubs[i].target == addr) return (unsigned long)&stubs[i]; } @@ -1054,7 +1002,6 @@ int module_trampoline_target(struct module *mod, unsigned long addr, unsigned long *target) { struct ppc64_stub_entry *stub; - func_desc_t funcdata; u32 magic; if (!within_module_core(addr, mod)) { @@ -1075,14 +1022,11 @@ int module_trampoline_target(struct module *mod, unsigned long addr, return -EFAULT; } - if (copy_from_kernel_nofault(&funcdata, &stub->funcdata, - sizeof(funcdata))) { - pr_err("%s: fault reading funcdata for stub %lx for %s\n", __func__, addr, mod->name); + if (copy_from_kernel_nofault(target, &stub->target, sizeof(*target))) { + pr_err("%s: fault reading target for stub %lx for %s\n", __func__, addr, mod->name); return -EFAULT; } - *target = stub_func_addr(funcdata); - return 0; } diff --git a/arch/powerpc/kernel/trace/ftrace.c b/arch/powerpc/kernel/trace/ftrace.c index a47f30373423..81a121b56c4d 100644 --- a/arch/powerpc/kernel/trace/ftrace.c +++ b/arch/powerpc/kernel/trace/ftrace.c @@ -864,13 +864,3 @@ unsigned long prepare_ftrace_return(unsigned long parent, unsigned long ip, } #endif #endif /* CONFIG_FUNCTION_GRAPH_TRACER */ - -#ifdef CONFIG_PPC64_ELF_ABI_V1 -char *arch_ftrace_match_adjust(char *str, const char *search) -{ - if (str[0] == '.' && search[0] != '.') - return str + 1; - else - return str; -} -#endif /* CONFIG_PPC64_ELF_ABI_V1 */ diff --git a/arch/powerpc/kernel/vdso/Makefile b/arch/powerpc/kernel/vdso/Makefile index 4c3f34485f08..d558a2dd9b65 100644 --- a/arch/powerpc/kernel/vdso/Makefile +++ b/arch/powerpc/kernel/vdso/Makefile @@ -15,7 +15,7 @@ ifneq ($(c-gettimeofday-y),) CFLAGS_vgettimeofday-32.o += -DDISABLE_BRANCH_PROFILING CFLAGS_vgettimeofday-32.o += -ffreestanding -fasynchronous-unwind-tables CFLAGS_REMOVE_vgettimeofday-32.o = $(CC_FLAGS_FTRACE) - CFLAGS_REMOVE_vgettimeofday-32.o += -mcmodel=medium -mabi=elfv1 -mabi=elfv2 -mcall-aixdesc + CFLAGS_REMOVE_vgettimeofday-32.o += -mcmodel=medium -mabi=elfv2 # This flag is supported by clang for 64-bit but not 32-bit so it will cause # an unused command line flag warning for this file. ifdef CONFIG_CC_IS_CLANG diff --git a/arch/powerpc/kernel/vdso/gettimeofday.S b/arch/powerpc/kernel/vdso/gettimeofday.S index 48fc6658053a..88110ec0a5a6 100644 --- a/arch/powerpc/kernel/vdso/gettimeofday.S +++ b/arch/powerpc/kernel/vdso/gettimeofday.S @@ -39,7 +39,7 @@ addi r4, r5, VDSO_DATA_OFFSET .endif #ifdef __powerpc64__ - bl CFUNC(DOTSYM(\funct)) + bl CFUNC(\funct) #else bl \funct #endif diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index 13614f0b269c..c3da2dd34691 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S @@ -186,14 +186,6 @@ SECTIONS SOFT_MASK_TABLE(8) RESTART_TABLE(8) -#ifdef CONFIG_PPC64_ELF_ABI_V1 - .opd : AT(ADDR(.opd) - LOAD_OFFSET) { - __start_opd = .; - KEEP(*(.opd)) - __end_opd = .; - } -#endif - . = ALIGN(8); __stf_entry_barrier_fixup : AT(ADDR(__stf_entry_barrier_fixup) - LOAD_OFFSET) { __start___stf_entry_barrier_fixup = .; diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S index 870110e3d9b1..50b3cae5e67d 100644 --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S @@ -1790,17 +1790,17 @@ hcall_real_fallback: .globl hcall_real_table hcall_real_table: .long 0 /* 0 - unused */ - .long DOTSYM(kvmppc_h_remove) - hcall_real_table - .long DOTSYM(kvmppc_h_enter) - hcall_real_table - .long DOTSYM(kvmppc_h_read) - hcall_real_table - .long DOTSYM(kvmppc_h_clear_mod) - hcall_real_table - .long DOTSYM(kvmppc_h_clear_ref) - hcall_real_table - .long DOTSYM(kvmppc_h_protect) - hcall_real_table + .long kvmppc_h_remove - hcall_real_table + .long kvmppc_h_enter - hcall_real_table + .long kvmppc_h_read - hcall_real_table + .long kvmppc_h_clear_mod - hcall_real_table + .long kvmppc_h_clear_ref - hcall_real_table + .long kvmppc_h_protect - hcall_real_table .long 0 /* 0x1c */ .long 0 /* 0x20 */ .long 0 /* 0x24 - H_SET_SPRG0 */ - .long DOTSYM(kvmppc_h_set_dabr) - hcall_real_table - .long DOTSYM(kvmppc_rm_h_page_init) - hcall_real_table + .long kvmppc_h_set_dabr - hcall_real_table + .long kvmppc_rm_h_page_init - hcall_real_table .long 0 /* 0x30 */ .long 0 /* 0x34 */ .long 0 /* 0x38 */ @@ -1815,11 +1815,11 @@ hcall_real_table: .long 0 /* 0x5c */ .long 0 /* 0x60 */ #ifdef CONFIG_KVM_XICS - .long DOTSYM(xics_rm_h_eoi) - hcall_real_table - .long DOTSYM(xics_rm_h_cppr) - hcall_real_table - .long DOTSYM(xics_rm_h_ipi) - hcall_real_table + .long xics_rm_h_eoi - hcall_real_table + .long xics_rm_h_cppr - hcall_real_table + .long xics_rm_h_ipi - hcall_real_table .long 0 /* 0x70 - H_IPOLL */ - .long DOTSYM(xics_rm_h_xirr) - hcall_real_table + .long xics_rm_h_xirr - hcall_real_table #else .long 0 /* 0x64 - H_EOI */ .long 0 /* 0x68 - H_CPPR */ @@ -1853,8 +1853,8 @@ hcall_real_table: .long 0 /* 0xd4 */ .long 0 /* 0xd8 */ .long 0 /* 0xdc */ - .long DOTSYM(kvmppc_h_cede) - hcall_real_table - .long DOTSYM(kvmppc_rm_h_confer) - hcall_real_table + .long kvmppc_h_cede - hcall_real_table + .long kvmppc_rm_h_confer - hcall_real_table .long 0 /* 0xe8 */ .long 0 /* 0xec */ .long 0 /* 0xf0 */ @@ -1870,11 +1870,11 @@ hcall_real_table: .long 0 /* 0x118 */ .long 0 /* 0x11c */ .long 0 /* 0x120 */ - .long DOTSYM(kvmppc_h_bulk_remove) - hcall_real_table + .long kvmppc_h_bulk_remove - hcall_real_table .long 0 /* 0x128 */ .long 0 /* 0x12c */ .long 0 /* 0x130 */ - .long DOTSYM(kvmppc_h_set_xdabr) - hcall_real_table + .long kvmppc_h_set_xdabr - hcall_real_table .long 0 /* 0x138 */ .long 0 /* 0x13c */ .long 0 /* 0x140 */ @@ -1989,11 +1989,11 @@ hcall_real_table: .long 0 /* 0x2f4 */ .long 0 /* 0x2f8 */ #ifdef CONFIG_KVM_XICS - .long DOTSYM(xics_rm_h_xirr_x) - hcall_real_table + .long xics_rm_h_xirr_x - hcall_real_table #else .long 0 /* 0x2fc - H_XIRR_X*/ #endif - .long DOTSYM(kvmppc_rm_h_random) - hcall_real_table + .long kvmppc_rm_h_random - hcall_real_table .globl hcall_real_table_end hcall_real_table_end: diff --git a/arch/powerpc/kvm/book3s_interrupts.S b/arch/powerpc/kvm/book3s_interrupts.S index f4bec2fc51aa..d65d405dabdc 100644 --- a/arch/powerpc/kvm/book3s_interrupts.S +++ b/arch/powerpc/kvm/book3s_interrupts.S @@ -15,15 +15,9 @@ #include <asm/asm-compat.h> #if defined(CONFIG_PPC_BOOK3S_64) -#ifdef CONFIG_PPC64_ELF_ABI_V2 -#define FUNC(name) name -#else -#define FUNC(name) GLUE(.,name) -#endif #define GET_SHADOW_VCPU(reg) addi reg, r13, PACA_SVCPU #elif defined(CONFIG_PPC_BOOK3S_32) -#define FUNC(name) name #define GET_SHADOW_VCPU(reg) lwz reg, (THREAD + THREAD_KVM_SVCPU)(r2) #endif /* CONFIG_PPC_BOOK3S_64 */ @@ -85,7 +79,7 @@ kvm_start_entry: kvm_start_lightweight: /* Copy registers into shadow vcpu so we can access them in real mode */ - bl FUNC(kvmppc_copy_to_svcpu) + bl kvmppc_copy_to_svcpu nop REST_GPR(3, r1) @@ -123,7 +117,7 @@ after_sprg3_load: PPC_LL r4, VCPU_SHADOW_MSR(r3) /* get shadow_msr */ /* Jump to segment patching handler and into our guest */ - bl FUNC(kvmppc_entry_trampoline) + bl kvmppc_entry_trampoline nop /* @@ -154,7 +148,7 @@ after_sprg3_load: /* Transfer reg values from shadow vcpu back to vcpu struct */ - bl FUNC(kvmppc_copy_from_svcpu) + bl kvmppc_copy_from_svcpu nop #ifdef CONFIG_PPC_BOOK3S_64 @@ -193,7 +187,7 @@ after_sprg3_load: /* Restore r3 (vcpu) */ REST_GPR(3, r1) - bl FUNC(kvmppc_handle_exit_pr) + bl kvmppc_handle_exit_pr /* If RESUME_GUEST, get back in the loop */ cmpwi r3, RESUME_GUEST diff --git a/arch/powerpc/kvm/book3s_rmhandlers.S b/arch/powerpc/kvm/book3s_rmhandlers.S index 0a557ffca9fe..415802bedfdf 100644 --- a/arch/powerpc/kvm/book3s_rmhandlers.S +++ b/arch/powerpc/kvm/book3s_rmhandlers.S @@ -24,17 +24,7 @@ * * ****************************************************************************/ -#if defined(CONFIG_PPC_BOOK3S_64) - -#ifdef CONFIG_PPC64_ELF_ABI_V2 -#define FUNC(name) name -#else -#define FUNC(name) GLUE(.,name) -#endif - -#elif defined(CONFIG_PPC_BOOK3S_32) - -#define FUNC(name) name +#if defined(CONFIG_PPC_BOOK3S_32) #define RFI_TO_KERNEL rfi #define RFI_TO_GUEST rfi diff --git a/arch/powerpc/net/bpf_jit.h b/arch/powerpc/net/bpf_jit.h index 72b7bb34fade..65f1b80ae589 100644 --- a/arch/powerpc/net/bpf_jit.h +++ b/arch/powerpc/net/bpf_jit.h @@ -13,12 +13,6 @@ #include <asm/types.h> #include <asm/ppc-opcode.h> -#ifdef CONFIG_PPC64_ELF_ABI_V1 -#define FUNCTION_DESCR_SIZE 24 -#else -#define FUNCTION_DESCR_SIZE 0 -#endif - #define CTX_NIA(ctx) ((unsigned long)ctx->idx * 4) #define PLANT_INSTR(d, idx, instr) \ diff --git a/arch/powerpc/net/bpf_jit_comp.c b/arch/powerpc/net/bpf_jit_comp.c index e93aefcfb83f..dec3119e2bdb 100644 --- a/arch/powerpc/net/bpf_jit_comp.c +++ b/arch/powerpc/net/bpf_jit_comp.c @@ -152,7 +152,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp) extable_len = fp->aux->num_exentries * sizeof(struct exception_table_entry); proglen = cgctx.idx * 4; - alloclen = proglen + FUNCTION_DESCR_SIZE + fixup_len + extable_len; + alloclen = proglen + fixup_len + extable_len; bpf_hdr = bpf_jit_binary_alloc(alloclen, &image, 4, bpf_jit_fill_ill_insns); if (!bpf_hdr) { @@ -161,10 +161,10 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp) } if (extable_len) - fp->aux->extable = (void *)image + FUNCTION_DESCR_SIZE + proglen + fixup_len; + fp->aux->extable = (void *)image + proglen + fixup_len; skip_init_ctx: - code_base = (u32 *)(image + FUNCTION_DESCR_SIZE); + code_base = (u32 *)image; /* Code generation passes 1-2 */ for (pass = 1; pass < 3; pass++) { @@ -191,15 +191,9 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp) */ bpf_jit_dump(flen, proglen, pass, code_base); -#ifdef CONFIG_PPC64_ELF_ABI_V1 - /* Function descriptor nastiness: Address + TOC */ - ((u64 *)image)[0] = (u64)code_base; - ((u64 *)image)[1] = local_paca->kernel_toc; -#endif - fp->bpf_func = (void *)image; fp->jited = 1; - fp->jited_len = proglen + FUNCTION_DESCR_SIZE; + fp->jited_len = proglen; bpf_flush_icache(bpf_hdr, (u8 *)bpf_hdr + bpf_hdr->size); if (!fp->is_func || extra_pass) { diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c index 0f8048f6dad6..4a5cc7acf21e 100644 --- a/arch/powerpc/net/bpf_jit_comp64.c +++ b/arch/powerpc/net/bpf_jit_comp64.c @@ -127,8 +127,7 @@ void bpf_jit_build_prologue(u32 *image, struct codegen_context *ctx) int i; #ifndef CONFIG_PPC_KERNEL_PCREL - if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2)) - EMIT(PPC_RAW_LD(_R2, _R13, offsetof(struct paca_struct, kernel_toc))); + EMIT(PPC_RAW_LD(_R2, _R13, offsetof(struct paca_struct, kernel_toc))); #endif /* @@ -247,9 +246,6 @@ int bpf_jit_emit_func_call_rel(u32 *image, struct codegen_context *ctx, u64 func if (WARN_ON_ONCE(func && is_module_text_address(func))) return -EINVAL; - /* skip past descriptor if elf v1 */ - func += FUNCTION_DESCR_SIZE; - /* Load function address into r12 */ PPC_LI64(_R12, func); @@ -285,8 +281,7 @@ static int bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 o int b2p_index = bpf_to_ppc(BPF_REG_3); int bpf_tailcall_prologue_size = 8; - if (IS_ENABLED(CONFIG_PPC64_ELF_ABI_V2)) - bpf_tailcall_prologue_size += 4; /* skip past the toc load */ + bpf_tailcall_prologue_size += 4; /* skip past the toc load */ /* * if (index >= array->map.max_entries) @@ -326,7 +321,7 @@ static int bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 o /* goto *(prog->bpf_func + prologue_size); */ EMIT(PPC_RAW_LD(bpf_to_ppc(TMP_REG_1), bpf_to_ppc(TMP_REG_1), offsetof(struct bpf_prog, bpf_func))); EMIT(PPC_RAW_ADDI(bpf_to_ppc(TMP_REG_1), bpf_to_ppc(TMP_REG_1), - FUNCTION_DESCR_SIZE + bpf_tailcall_prologue_size)); + bpf_tailcall_prologue_size)); EMIT(PPC_RAW_MTCTR(bpf_to_ppc(TMP_REG_1))); /* tear down stack, restore NVRs, ... */ @@ -743,7 +738,7 @@ int bpf_jit_build_body(struct bpf_prog *fp, u32 *image, struct codegen_context * break; case STF_BARRIER_FALLBACK: ctx->seen |= SEEN_FUNC; - PPC_LI64(_R12, dereference_kernel_function_descriptor(bpf_stf_barrier)); + PPC_LI64(_R12, bpf_stf_barrier); EMIT(PPC_RAW_MTCTR(_R12)); EMIT(PPC_RAW_BCTRL()); break; diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index 45fd975ef521..51d00f5aadc7 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype @@ -627,12 +627,6 @@ config CPU_LITTLE_ENDIAN endchoice -config PPC64_ELF_ABI_V1 - def_bool PPC64 && (CPU_BIG_ENDIAN && !PPC64_BIG_ENDIAN_ELF_ABI_V2) - -config PPC64_ELF_ABI_V2 - def_bool PPC64 && !PPC64_ELF_ABI_V1 - config PPC64_BOOT_WRAPPER def_bool n depends on CPU_LITTLE_ENDIAN diff --git a/drivers/crypto/vmx/Makefile b/drivers/crypto/vmx/Makefile index 7257b8c44626..8e7e559d6098 100644 --- a/drivers/crypto/vmx/Makefile +++ b/drivers/crypto/vmx/Makefile @@ -5,11 +5,7 @@ vmx-crypto-objs := vmx.o aesp8-ppc.o ghashp8-ppc.o aes.o aes_cbc.o aes_ctr.o aes ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y) override flavour := linux-ppc64le else -ifdef CONFIG_PPC64_ELF_ABI_V2 override flavour := linux-ppc64-elfv2 -else -override flavour := linux-ppc64 -endif endif quiet_cmd_perl = PERL $@ diff --git a/kernel/extable.c b/kernel/extable.c index 71f482581cab..3b559b2d55a9 100644 --- a/kernel/extable.c +++ b/kernel/extable.c @@ -133,7 +133,7 @@ int kernel_text_address(unsigned long addr) } /* - * On some architectures (PPC64, IA64, PARISC) function pointers + * On some architectures (IA64, PARISC) function pointers * are actually only tokens to some data that then holds the * real function address. As a result, to find if a function * pointer is part of the kernel text, we need to do some diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 76973a70ab9d..d50ca738d408 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c @@ -4122,23 +4122,11 @@ struct ftrace_glob { int type; }; -/* - * If symbols in an architecture don't correspond exactly to the user-visible - * name of what they represent, it is possible to define this function to - * perform the necessary adjustments. -*/ -char * __weak arch_ftrace_match_adjust(char *str, const char *search) -{ - return str; -} - static int ftrace_match(char *str, struct ftrace_glob *g) { int matched = 0; int slen; - str = arch_ftrace_match_adjust(str, g->search); - switch (g->type) { case MATCH_FULL: if (strcmp(str, g->search) == 0)