As the bug report [1] pointed out, <linux/vermagic.h> must be included after <linux/module.h>. I believe we should not impose any include order restriction. We often sort include directives alphabetically, but it is just coding style convention. Technically, we can include header files in any order by making every header self-contained. Currently, arch-specific MODULE_ARCH_VERMAGIC is defined in <asm/module.h>, which is not included from <linux/vermagic.h>. Hence, the straight-forward fix-up would be as follows: |--- a/include/linux/vermagic.h |+++ b/include/linux/vermagic.h |@@ -1,5 +1,6 @@ | /* SPDX-License-Identifier: GPL-2.0 */ | #include <generated/utsrelease.h> |+#include <linux/module.h> | | /* Simply sanity version stamp for modules. */ | #ifdef CONFIG_SMP This works enough, but for further cleanups, I split MODULE_ARCH_VERMAGIC definitions into <asm/vermagic.h>. With this, <linux/module.h> and <linux/vermagic.h> will be orthogonal, and the location of MODULE_ARCH_VERMAGIC definitions will be consistent. For arc and ia64, MODULE_PROC_FAMILY is only used for defining MODULE_ARCH_VERMAGIC. I squashed it. For hexagon, nds32, and xtensa, I removed <asm/modules.h> entirely because they contained nothing but MODULE_ARCH_VERMAGIC definition. Kbuild will automatically generate <asm/modules.h> at build-time, wrapping <asm-generic/module.h>. [1] https://lore.kernel.org/lkml/20200411155623.GA22175@zn.tnic Reported-by: Borislav Petkov <bp@suse.de> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Acked-by: Jessica Yu <jeyu@kernel.org>
87 lines
2.3 KiB
C
87 lines
2.3 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _ASM_MODULE_H
|
|
#define _ASM_MODULE_H
|
|
|
|
#include <linux/list.h>
|
|
#include <linux/elf.h>
|
|
#include <asm/extable.h>
|
|
|
|
struct mod_arch_specific {
|
|
/* Data Bus Error exception tables */
|
|
struct list_head dbe_list;
|
|
const struct exception_table_entry *dbe_start;
|
|
const struct exception_table_entry *dbe_end;
|
|
struct mips_hi16 *r_mips_hi16_list;
|
|
};
|
|
|
|
typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */
|
|
|
|
typedef struct {
|
|
Elf64_Addr r_offset; /* Address of relocation. */
|
|
Elf64_Word r_sym; /* Symbol index. */
|
|
Elf64_Byte r_ssym; /* Special symbol. */
|
|
Elf64_Byte r_type3; /* Third relocation. */
|
|
Elf64_Byte r_type2; /* Second relocation. */
|
|
Elf64_Byte r_type; /* First relocation. */
|
|
} Elf64_Mips_Rel;
|
|
|
|
typedef struct {
|
|
Elf64_Addr r_offset; /* Address of relocation. */
|
|
Elf64_Word r_sym; /* Symbol index. */
|
|
Elf64_Byte r_ssym; /* Special symbol. */
|
|
Elf64_Byte r_type3; /* Third relocation. */
|
|
Elf64_Byte r_type2; /* Second relocation. */
|
|
Elf64_Byte r_type; /* First relocation. */
|
|
Elf64_Sxword r_addend; /* Addend. */
|
|
} Elf64_Mips_Rela;
|
|
|
|
#ifdef CONFIG_32BIT
|
|
#define Elf_Shdr Elf32_Shdr
|
|
#define Elf_Sym Elf32_Sym
|
|
#define Elf_Ehdr Elf32_Ehdr
|
|
#define Elf_Addr Elf32_Addr
|
|
#define Elf_Rel Elf32_Rel
|
|
#define Elf_Rela Elf32_Rela
|
|
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
|
|
#define ELF_R_SYM(X) ELF32_R_SYM(X)
|
|
|
|
#define Elf_Mips_Rel Elf32_Rel
|
|
#define Elf_Mips_Rela Elf32_Rela
|
|
|
|
#define ELF_MIPS_R_SYM(rel) ELF32_R_SYM((rel).r_info)
|
|
#define ELF_MIPS_R_TYPE(rel) ELF32_R_TYPE((rel).r_info)
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_64BIT
|
|
#define Elf_Shdr Elf64_Shdr
|
|
#define Elf_Sym Elf64_Sym
|
|
#define Elf_Ehdr Elf64_Ehdr
|
|
#define Elf_Addr Elf64_Addr
|
|
#define Elf_Rel Elf64_Rel
|
|
#define Elf_Rela Elf64_Rela
|
|
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
|
|
#define ELF_R_SYM(X) ELF64_R_SYM(X)
|
|
|
|
#define Elf_Mips_Rel Elf64_Mips_Rel
|
|
#define Elf_Mips_Rela Elf64_Mips_Rela
|
|
|
|
#define ELF_MIPS_R_SYM(rel) ((rel).r_sym)
|
|
#define ELF_MIPS_R_TYPE(rel) ((rel).r_type)
|
|
|
|
#endif
|
|
|
|
#ifdef CONFIG_MODULES
|
|
/* Given an address, look for it in the exception tables. */
|
|
const struct exception_table_entry*search_module_dbetables(unsigned long addr);
|
|
#else
|
|
/* Given an address, look for it in the exception tables. */
|
|
static inline const struct exception_table_entry *
|
|
search_module_dbetables(unsigned long addr)
|
|
{
|
|
return NULL;
|
|
}
|
|
#endif
|
|
|
|
#endif /* _ASM_MODULE_H */
|