Commit a86aa72e authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Catalin Marinas

arm64: kernel: Don't rely on objcopy to make code under pi/ __init

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: default avatarArd Biesheuvel <ardb@kernel.org>
Link: https://lore.kernel.org/r/20240214122845.2033971-47-ardb+git@google.comSigned-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 48157aa3
...@@ -28,11 +28,13 @@ quiet_cmd_piobjcopy = $(quiet_cmd_objcopy) ...@@ -28,11 +28,13 @@ quiet_cmd_piobjcopy = $(quiet_cmd_objcopy)
cmd_piobjcopy = $(cmd_objcopy) && $(obj)/relacheck $(@) $(<) cmd_piobjcopy = $(cmd_objcopy) && $(obj)/relacheck $(@) $(<)
$(obj)/%.pi.o: OBJCOPYFLAGS := --prefix-symbols=__pi_ \ $(obj)/%.pi.o: OBJCOPYFLAGS := --prefix-symbols=__pi_ \
--remove-section=.note.gnu.property \ --remove-section=.note.gnu.property
--prefix-alloc-sections=.init
$(obj)/%.pi.o: $(obj)/%.o $(obj)/relacheck FORCE $(obj)/%.pi.o: $(obj)/%.o $(obj)/relacheck FORCE
$(call if_changed,piobjcopy) $(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 $(obj)/lib-%.o: $(srctree)/lib/%.c FORCE
$(call if_changed_rule,cc_o_c) $(call if_changed_rule,cc_o_c)
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
#include <asm/pgtable.h> #include <asm/pgtable.h>
/* taken from lib/string.c */ /* 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; size_t l1, l2;
...@@ -33,7 +33,7 @@ static char *__strstr(const char *s1, const char *s2) ...@@ -33,7 +33,7 @@ static char *__strstr(const char *s1, const char *s2)
} }
return NULL; return NULL;
} }
static bool cmdline_contains_nokaslr(const u8 *cmdline) static bool __init cmdline_contains_nokaslr(const u8 *cmdline)
{ {
const u8 *str; const u8 *str;
...@@ -41,7 +41,7 @@ static bool cmdline_contains_nokaslr(const u8 *cmdline) ...@@ -41,7 +41,7 @@ static bool cmdline_contains_nokaslr(const u8 *cmdline)
return str == cmdline || (str > cmdline && *(str - 1) == ' '); 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)) { if (!IS_ENABLED(CONFIG_CMDLINE_FORCE)) {
int node; int node;
...@@ -67,17 +67,19 @@ static bool is_kaslr_disabled_cmdline(void *fdt) ...@@ -67,17 +67,19 @@ static bool is_kaslr_disabled_cmdline(void *fdt)
return cmdline_contains_nokaslr(CONFIG_CMDLINE); 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; int node, len;
fdt64_t *prop; fdt64_t *prop;
u64 ret; u64 ret;
node = fdt_path_offset(fdt, "/chosen"); node = fdt_path_offset(fdt, chosen_str);
if (node < 0) if (node < 0)
return 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)) if (!prop || len != sizeof(u64))
return 0; return 0;
...@@ -86,7 +88,7 @@ static u64 get_kaslr_seed(void *fdt) ...@@ -86,7 +88,7 @@ static u64 get_kaslr_seed(void *fdt)
return ret; return ret;
} }
asmlinkage u64 kaslr_early_init(void *fdt) asmlinkage u64 __init kaslr_early_init(void *fdt)
{ {
u64 seed, range; u64 seed, range;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment