mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-20 17:28:39 +07:00
73aca179d7
If you build the kernel with CONFIG_RELOCATABLE=n, then install the modules, rebuild the kernel with CONFIG_RELOCATABLE=y and leave the old modules installed, we crash something like: Unable to handle kernel paging request for data at address 0xd000000018d66cef Faulting instruction address: 0xc0000000021ddd08 Oops: Kernel access of bad area, sig: 11 [#1] Modules linked in: x_tables autofs4 CPU: 2 PID: 1 Comm: systemd Not tainted 4.16.0-rc6-gcc_ubuntu_le-g99fec39 #1 ... NIP check_version.isra.22+0x118/0x170 Call Trace: __ksymtab_xt_unregister_table+0x58/0xfffffffffffffcb8 [x_tables] (unreliable) resolve_symbol+0xb4/0x150 load_module+0x10e8/0x29a0 SyS_finit_module+0x110/0x140 system_call+0x58/0x6c This happens because since commit71810db27c
("modversions: treat symbol CRCs as 32 bit quantities"), a relocatable kernel encodes and handles symbol CRCs differently from a non-relocatable kernel. Although it's possible we could try and detect this situation and handle it, it's much more robust to simply make the state of CONFIG_RELOCATABLE part of the module vermagic. Fixes:71810db27c
("modversions: treat symbol CRCs as 32 bit quantities") Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
112 lines
2.8 KiB
C
112 lines
2.8 KiB
C
#ifndef _ASM_POWERPC_MODULE_H
|
|
#define _ASM_POWERPC_MODULE_H
|
|
#ifdef __KERNEL__
|
|
|
|
/*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
|
|
#include <linux/list.h>
|
|
#include <asm/bug.h>
|
|
#include <asm-generic/module.h>
|
|
|
|
|
|
#ifdef CC_USING_MPROFILE_KERNEL
|
|
#define MODULE_ARCH_VERMAGIC_FTRACE "mprofile-kernel "
|
|
#else
|
|
#define MODULE_ARCH_VERMAGIC_FTRACE ""
|
|
#endif
|
|
|
|
#ifdef CONFIG_RELOCATABLE
|
|
#define MODULE_ARCH_VERMAGIC_RELOCATABLE "relocatable "
|
|
#else
|
|
#define MODULE_ARCH_VERMAGIC_RELOCATABLE ""
|
|
#endif
|
|
|
|
#define MODULE_ARCH_VERMAGIC MODULE_ARCH_VERMAGIC_FTRACE MODULE_ARCH_VERMAGIC_RELOCATABLE
|
|
|
|
#ifndef __powerpc64__
|
|
/*
|
|
* Thanks to Paul M for explaining this.
|
|
*
|
|
* PPC can only do rel jumps += 32MB, and often the kernel and other
|
|
* modules are further away than this. So, we jump to a table of
|
|
* trampolines attached to the module (the Procedure Linkage Table)
|
|
* whenever that happens.
|
|
*/
|
|
|
|
struct ppc_plt_entry {
|
|
/* 16 byte jump instruction sequence (4 instructions) */
|
|
unsigned int jump[4];
|
|
};
|
|
#endif /* __powerpc64__ */
|
|
|
|
|
|
struct mod_arch_specific {
|
|
#ifdef __powerpc64__
|
|
unsigned int stubs_section; /* Index of stubs section in module */
|
|
unsigned int toc_section; /* What section is the TOC? */
|
|
bool toc_fixed; /* Have we fixed up .TOC.? */
|
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
|
unsigned long toc;
|
|
unsigned long tramp;
|
|
#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;
|
|
unsigned int init_plt_section;
|
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
|
unsigned long tramp;
|
|
#endif
|
|
#endif /* powerpc64 */
|
|
|
|
/* List of BUG addresses, source line numbers and filenames */
|
|
struct list_head bug_list;
|
|
struct bug_entry *bug_table;
|
|
unsigned int num_bugs;
|
|
};
|
|
|
|
/*
|
|
* Select ELF headers.
|
|
* Make empty section for module_frob_arch_sections to expand.
|
|
*/
|
|
|
|
#ifdef __powerpc64__
|
|
# ifdef MODULE
|
|
asm(".section .stubs,\"ax\",@nobits; .align 3; .previous");
|
|
# endif
|
|
#else
|
|
# ifdef MODULE
|
|
asm(".section .plt,\"ax\",@nobits; .align 3; .previous");
|
|
asm(".section .init.plt,\"ax\",@nobits; .align 3; .previous");
|
|
# endif /* MODULE */
|
|
#endif
|
|
|
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
|
# ifdef MODULE
|
|
asm(".section .ftrace.tramp,\"ax\",@nobits; .align 3; .previous");
|
|
# endif /* MODULE */
|
|
#endif
|
|
|
|
int module_trampoline_target(struct module *mod, unsigned long trampoline,
|
|
unsigned long *target);
|
|
|
|
#ifdef CONFIG_DYNAMIC_FTRACE
|
|
int module_finalize_ftrace(struct module *mod, const Elf_Shdr *sechdrs);
|
|
#else
|
|
static inline int module_finalize_ftrace(struct module *mod, const Elf_Shdr *sechdrs)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _ASM_POWERPC_MODULE_H */
|