arm64: kernel: Don't rely on objcopy to make code under pi/ __init
authorArd Biesheuvel <ardb@kernel.org>
Wed, 14 Feb 2024 12:28:48 +0000 (13:28 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Fri, 16 Feb 2024 12:42:28 +0000 (12:42 +0000)
We will add some code under pi/ that contains global variables that
should not end up in __initdata, as they will not be writable via the
initial ID map. So only rely on objcopy for making the libfdt code
__init, and use explicit annotations for the rest.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20240214122845.2033971-47-ardb+git@google.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kernel/pi/Makefile
arch/arm64/kernel/pi/kaslr_early.c

index bc32a431fe35e6f4cd0b09a46b7139400ac6f49f..2bbe866417d453ff684fa22a815ca46e4cf21f9a 100644 (file)
@@ -28,11 +28,13 @@ quiet_cmd_piobjcopy = $(quiet_cmd_objcopy)
       cmd_piobjcopy = $(cmd_objcopy) && $(obj)/relacheck $(@) $(<)
 
 $(obj)/%.pi.o: OBJCOPYFLAGS := --prefix-symbols=__pi_ \
-                              --remove-section=.note.gnu.property \
-                              --prefix-alloc-sections=.init
+                              --remove-section=.note.gnu.property
 $(obj)/%.pi.o: $(obj)/%.o $(obj)/relacheck FORCE
        $(call if_changed,piobjcopy)
 
+# ensure that all the lib- code ends up as __init code and data
+$(obj)/lib-%.pi.o: OBJCOPYFLAGS += --prefix-alloc-sections=.init
+
 $(obj)/lib-%.o: $(srctree)/lib/%.c FORCE
        $(call if_changed_rule,cc_o_c)
 
index b9e0bb4bc6a9766f10344527c88edc7bcf21297d..167081b30a152d0af6a87fe4b5d84741afcd4d75 100644 (file)
@@ -17,7 +17,7 @@
 #include <asm/pgtable.h>
 
 /* taken from lib/string.c */
-static char *__strstr(const char *s1, const char *s2)
+static char *__init __strstr(const char *s1, const char *s2)
 {
        size_t l1, l2;
 
@@ -33,7 +33,7 @@ static char *__strstr(const char *s1, const char *s2)
        }
        return NULL;
 }
-static bool cmdline_contains_nokaslr(const u8 *cmdline)
+static bool __init cmdline_contains_nokaslr(const u8 *cmdline)
 {
        const u8 *str;
 
@@ -41,7 +41,7 @@ static bool cmdline_contains_nokaslr(const u8 *cmdline)
        return str == cmdline || (str > cmdline && *(str - 1) == ' ');
 }
 
-static bool is_kaslr_disabled_cmdline(void *fdt)
+static bool __init is_kaslr_disabled_cmdline(void *fdt)
 {
        if (!IS_ENABLED(CONFIG_CMDLINE_FORCE)) {
                int node;
@@ -67,17 +67,19 @@ out:
        return cmdline_contains_nokaslr(CONFIG_CMDLINE);
 }
 
-static u64 get_kaslr_seed(void *fdt)
+static u64 __init get_kaslr_seed(void *fdt)
 {
+       static char const chosen_str[] __initconst = "chosen";
+       static char const seed_str[] __initconst = "kaslr-seed";
        int node, len;
        fdt64_t *prop;
        u64 ret;
 
-       node = fdt_path_offset(fdt, "/chosen");
+       node = fdt_path_offset(fdt, chosen_str);
        if (node < 0)
                return 0;
 
-       prop = fdt_getprop_w(fdt, node, "kaslr-seed", &len);
+       prop = fdt_getprop_w(fdt, node, seed_str, &len);
        if (!prop || len != sizeof(u64))
                return 0;
 
@@ -86,7 +88,7 @@ static u64 get_kaslr_seed(void *fdt)
        return ret;
 }
 
-asmlinkage u64 kaslr_early_init(void *fdt)
+asmlinkage u64 __init kaslr_early_init(void *fdt)
 {
        u64 seed, range;