diff options
| author | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2018-08-22 00:56:13 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-08-22 13:52:47 -0400 |
| commit | 1b1eeca7e4c19fa76d409d4c7b338dba21f2df45 (patch) | |
| tree | 6443f1ee2cdc661123076f02bda70dc25852045e /init | |
| parent | 7290d58095712a89f845e1bca05334796dd49ed2 (diff) | |
init: allow initcall tables to be emitted using relative references
Allow the initcall tables to be emitted using relative references that
are only half the size on 64-bit architectures and don't require fixups
at runtime on relocatable kernels.
Link: http://lkml.kernel.org/r/20180704083651.24360-5-ard.biesheuvel@linaro.org
Acked-by: James Morris <james.morris@microsoft.com>
Acked-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Acked-by: Petr Mladek <pmladek@suse.com>
Acked-by: Michael Ellerman <mpe@ellerman.id.au>
Acked-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Bjorn Helgaas <bhelgaas@google.com>
Cc: Catalin Marinas <catalin.marinas@arm.com>
Cc: James Morris <jmorris@namei.org>
Cc: Jessica Yu <jeyu@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Nicolas Pitre <nico@linaro.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Russell King <linux@armlinux.org.uk>
Cc: "Serge E. Hallyn" <serge@hallyn.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Garnier <thgarnie@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will.deacon@arm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'init')
| -rw-r--r-- | init/main.c | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/init/main.c b/init/main.c index b729e1f22838..3a6ce89e128f 100644 --- a/init/main.c +++ b/init/main.c | |||
| @@ -902,18 +902,18 @@ int __init_or_module do_one_initcall(initcall_t fn) | |||
| 902 | } | 902 | } |
| 903 | 903 | ||
| 904 | 904 | ||
| 905 | extern initcall_t __initcall_start[]; | 905 | extern initcall_entry_t __initcall_start[]; |
| 906 | extern initcall_t __initcall0_start[]; | 906 | extern initcall_entry_t __initcall0_start[]; |
| 907 | extern initcall_t __initcall1_start[]; | 907 | extern initcall_entry_t __initcall1_start[]; |
| 908 | extern initcall_t __initcall2_start[]; | 908 | extern initcall_entry_t __initcall2_start[]; |
| 909 | extern initcall_t __initcall3_start[]; | 909 | extern initcall_entry_t __initcall3_start[]; |
| 910 | extern initcall_t __initcall4_start[]; | 910 | extern initcall_entry_t __initcall4_start[]; |
| 911 | extern initcall_t __initcall5_start[]; | 911 | extern initcall_entry_t __initcall5_start[]; |
| 912 | extern initcall_t __initcall6_start[]; | 912 | extern initcall_entry_t __initcall6_start[]; |
| 913 | extern initcall_t __initcall7_start[]; | 913 | extern initcall_entry_t __initcall7_start[]; |
| 914 | extern initcall_t __initcall_end[]; | 914 | extern initcall_entry_t __initcall_end[]; |
| 915 | 915 | ||
| 916 | static initcall_t *initcall_levels[] __initdata = { | 916 | static initcall_entry_t *initcall_levels[] __initdata = { |
| 917 | __initcall0_start, | 917 | __initcall0_start, |
| 918 | __initcall1_start, | 918 | __initcall1_start, |
| 919 | __initcall2_start, | 919 | __initcall2_start, |
| @@ -939,7 +939,7 @@ static char *initcall_level_names[] __initdata = { | |||
| 939 | 939 | ||
| 940 | static void __init do_initcall_level(int level) | 940 | static void __init do_initcall_level(int level) |
| 941 | { | 941 | { |
| 942 | initcall_t *fn; | 942 | initcall_entry_t *fn; |
| 943 | 943 | ||
| 944 | strcpy(initcall_command_line, saved_command_line); | 944 | strcpy(initcall_command_line, saved_command_line); |
| 945 | parse_args(initcall_level_names[level], | 945 | parse_args(initcall_level_names[level], |
| @@ -950,7 +950,7 @@ static void __init do_initcall_level(int level) | |||
| 950 | 950 | ||
| 951 | trace_initcall_level(initcall_level_names[level]); | 951 | trace_initcall_level(initcall_level_names[level]); |
| 952 | for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++) | 952 | for (fn = initcall_levels[level]; fn < initcall_levels[level+1]; fn++) |
| 953 | do_one_initcall(*fn); | 953 | do_one_initcall(initcall_from_entry(fn)); |
| 954 | } | 954 | } |
| 955 | 955 | ||
| 956 | static void __init do_initcalls(void) | 956 | static void __init do_initcalls(void) |
| @@ -981,11 +981,11 @@ static void __init do_basic_setup(void) | |||
| 981 | 981 | ||
| 982 | static void __init do_pre_smp_initcalls(void) | 982 | static void __init do_pre_smp_initcalls(void) |
| 983 | { | 983 | { |
| 984 | initcall_t *fn; | 984 | initcall_entry_t *fn; |
| 985 | 985 | ||
| 986 | trace_initcall_level("early"); | 986 | trace_initcall_level("early"); |
| 987 | for (fn = __initcall_start; fn < __initcall0_start; fn++) | 987 | for (fn = __initcall_start; fn < __initcall0_start; fn++) |
| 988 | do_one_initcall(*fn); | 988 | do_one_initcall(initcall_from_entry(fn)); |
| 989 | } | 989 | } |
| 990 | 990 | ||
| 991 | /* | 991 | /* |
