hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/arch/arm64/include/asm/module.h
....@@ -1,28 +1,15 @@
1
+/* SPDX-License-Identifier: GPL-2.0-only */
12 /*
23 * Copyright (C) 2012 ARM Ltd.
3
- *
4
- * This program is free software; you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License version 2 as
6
- * published by the Free Software Foundation.
7
- *
8
- * This program is distributed in the hope that it will be useful,
9
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
10
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
- * GNU General Public License for more details.
12
- *
13
- * You should have received a copy of the GNU General Public License
14
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
154 */
165 #ifndef __ASM_MODULE_H
176 #define __ASM_MODULE_H
187
198 #include <asm-generic/module.h>
209
21
-#define MODULE_ARCH_VERMAGIC "aarch64"
22
-
2310 #ifdef CONFIG_ARM64_MODULE_PLTS
2411 struct mod_plt_sec {
25
- struct elf64_shdr *plt;
12
+ int plt_shndx;
2613 int plt_num_entries;
2714 int plt_max_entries;
2815 };
....@@ -32,14 +19,22 @@
3219 struct mod_plt_sec init;
3320
3421 /* for CONFIG_DYNAMIC_FTRACE */
35
- struct plt_entry *ftrace_trampoline;
22
+ struct plt_entry *ftrace_trampolines;
23
+
24
+ /* for FIPS 140 certified kernel module */
25
+ const Elf64_Rela *text_relocations;
26
+ const Elf64_Rela *rodata_relocations;
27
+ int num_text_relocations;
28
+ int num_rodata_relocations;
3629 };
3730 #endif
3831
39
-u64 module_emit_plt_entry(struct module *mod, void *loc, const Elf64_Rela *rela,
32
+u64 module_emit_plt_entry(struct module *mod, Elf64_Shdr *sechdrs,
33
+ void *loc, const Elf64_Rela *rela,
4034 Elf64_Sym *sym);
4135
42
-u64 module_emit_veneer_for_adrp(struct module *mod, void *loc, u64 val);
36
+u64 module_emit_veneer_for_adrp(struct module *mod, Elf64_Shdr *sechdrs,
37
+ void *loc, u64 val);
4338
4439 #ifdef CONFIG_RANDOMIZE_BASE
4540 extern u64 module_alloc_base;
....@@ -56,39 +51,24 @@
5651 * is exactly what we are dealing with here, we are free to use x16
5752 * as a scratch register in the PLT veneers.
5853 */
59
- __le32 mov0; /* movn x16, #0x.... */
60
- __le32 mov1; /* movk x16, #0x...., lsl #16 */
61
- __le32 mov2; /* movk x16, #0x...., lsl #32 */
54
+ __le32 adrp; /* adrp x16, .... */
55
+ __le32 add; /* add x16, x16, #0x.... */
6256 __le32 br; /* br x16 */
6357 };
6458
65
-static inline struct plt_entry get_plt_entry(u64 val)
59
+static inline bool is_forbidden_offset_for_adrp(void *place)
6660 {
67
- /*
68
- * MOVK/MOVN/MOVZ opcode:
69
- * +--------+------------+--------+-----------+-------------+---------+
70
- * | sf[31] | opc[30:29] | 100101 | hw[22:21] | imm16[20:5] | Rd[4:0] |
71
- * +--------+------------+--------+-----------+-------------+---------+
72
- *
73
- * Rd := 0x10 (x16)
74
- * hw := 0b00 (no shift), 0b01 (lsl #16), 0b10 (lsl #32)
75
- * opc := 0b11 (MOVK), 0b00 (MOVN), 0b10 (MOVZ)
76
- * sf := 1 (64-bit variant)
77
- */
78
- return (struct plt_entry){
79
- cpu_to_le32(0x92800010 | (((~val ) & 0xffff)) << 5),
80
- cpu_to_le32(0xf2a00010 | ((( val >> 16) & 0xffff)) << 5),
81
- cpu_to_le32(0xf2c00010 | ((( val >> 32) & 0xffff)) << 5),
82
- cpu_to_le32(0xd61f0200)
83
- };
61
+ return IS_ENABLED(CONFIG_ARM64_ERRATUM_843419) &&
62
+ cpus_have_const_cap(ARM64_WORKAROUND_843419) &&
63
+ ((u64)place & 0xfff) >= 0xff8;
8464 }
8565
86
-static inline bool plt_entries_equal(const struct plt_entry *a,
87
- const struct plt_entry *b)
66
+struct plt_entry get_plt_entry(u64 dst, void *pc);
67
+bool plt_entries_equal(const struct plt_entry *a, const struct plt_entry *b);
68
+
69
+static inline bool plt_entry_is_initialized(const struct plt_entry *e)
8870 {
89
- return a->mov0 == b->mov0 &&
90
- a->mov1 == b->mov1 &&
91
- a->mov2 == b->mov2;
71
+ return e->adrp || e->add || e->br;
9272 }
9373
9474 #endif /* __ASM_MODULE_H */