diff options
Diffstat (limited to 'arch/arm/kernel/traps.c')
-rw-r--r-- | arch/arm/kernel/traps.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 2c8c7fa78b8c..e3ca35ccd38e 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -800,15 +800,26 @@ void __init trap_init(void) | |||
800 | return; | 800 | return; |
801 | } | 801 | } |
802 | 802 | ||
803 | static void __init kuser_get_tls_init(unsigned long vectors) | 803 | #ifdef CONFIG_KUSER_HELPERS |
804 | static void __init kuser_init(void *vectors) | ||
804 | { | 805 | { |
806 | extern char __kuser_helper_start[], __kuser_helper_end[]; | ||
807 | int kuser_sz = __kuser_helper_end - __kuser_helper_start; | ||
808 | |||
809 | memcpy(vectors + 0x1000 - kuser_sz, __kuser_helper_start, kuser_sz); | ||
810 | |||
805 | /* | 811 | /* |
806 | * vectors + 0xfe0 = __kuser_get_tls | 812 | * vectors + 0xfe0 = __kuser_get_tls |
807 | * vectors + 0xfe8 = hardware TLS instruction at 0xffff0fe8 | 813 | * vectors + 0xfe8 = hardware TLS instruction at 0xffff0fe8 |
808 | */ | 814 | */ |
809 | if (tls_emu || has_tls_reg) | 815 | if (tls_emu || has_tls_reg) |
810 | memcpy((void *)vectors + 0xfe0, (void *)vectors + 0xfe8, 4); | 816 | memcpy(vectors + 0xfe0, vectors + 0xfe8, 4); |
817 | } | ||
818 | #else | ||
819 | static void __init kuser_init(void *vectors) | ||
820 | { | ||
811 | } | 821 | } |
822 | #endif | ||
812 | 823 | ||
813 | void __init early_trap_init(void *vectors_base) | 824 | void __init early_trap_init(void *vectors_base) |
814 | { | 825 | { |
@@ -816,8 +827,6 @@ void __init early_trap_init(void *vectors_base) | |||
816 | unsigned long vectors = (unsigned long)vectors_base; | 827 | unsigned long vectors = (unsigned long)vectors_base; |
817 | extern char __stubs_start[], __stubs_end[]; | 828 | extern char __stubs_start[], __stubs_end[]; |
818 | extern char __vectors_start[], __vectors_end[]; | 829 | extern char __vectors_start[], __vectors_end[]; |
819 | extern char __kuser_helper_start[], __kuser_helper_end[]; | ||
820 | int kuser_sz = __kuser_helper_end - __kuser_helper_start; | ||
821 | unsigned i; | 830 | unsigned i; |
822 | 831 | ||
823 | vectors_page = vectors_base; | 832 | vectors_page = vectors_base; |
@@ -838,12 +847,8 @@ void __init early_trap_init(void *vectors_base) | |||
838 | */ | 847 | */ |
839 | memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start); | 848 | memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start); |
840 | memcpy((void *)vectors + 0x1000, __stubs_start, __stubs_end - __stubs_start); | 849 | memcpy((void *)vectors + 0x1000, __stubs_start, __stubs_end - __stubs_start); |
841 | memcpy((void *)vectors + 0x1000 - kuser_sz, __kuser_helper_start, kuser_sz); | ||
842 | 850 | ||
843 | /* | 851 | kuser_init(vectors_base); |
844 | * Do processor specific fixups for the kuser helpers | ||
845 | */ | ||
846 | kuser_get_tls_init(vectors); | ||
847 | 852 | ||
848 | /* | 853 | /* |
849 | * Copy signal return handlers into the vector page, and | 854 | * Copy signal return handlers into the vector page, and |