diff options
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r-- | arch/arm/kernel/entry-armv.S | 4 | ||||
-rw-r--r-- | arch/arm/kernel/fiq.c | 5 | ||||
-rw-r--r-- | arch/arm/kernel/traps.c | 14 |
3 files changed, 17 insertions, 6 deletions
diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index c09e3573c5de..35f3f20d6731 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S | |||
@@ -735,7 +735,7 @@ ENTRY(__switch_to) | |||
735 | THUMB( stmia ip!, {r4 - sl, fp} ) @ Store most regs on stack | 735 | THUMB( stmia ip!, {r4 - sl, fp} ) @ Store most regs on stack |
736 | THUMB( str sp, [ip], #4 ) | 736 | THUMB( str sp, [ip], #4 ) |
737 | THUMB( str lr, [ip], #4 ) | 737 | THUMB( str lr, [ip], #4 ) |
738 | #ifdef CONFIG_MMU | 738 | #ifdef CONFIG_CPU_USE_DOMAINS |
739 | ldr r6, [r2, #TI_CPU_DOMAIN] | 739 | ldr r6, [r2, #TI_CPU_DOMAIN] |
740 | #endif | 740 | #endif |
741 | set_tls r3, r4, r5 | 741 | set_tls r3, r4, r5 |
@@ -744,7 +744,7 @@ ENTRY(__switch_to) | |||
744 | ldr r8, =__stack_chk_guard | 744 | ldr r8, =__stack_chk_guard |
745 | ldr r7, [r7, #TSK_STACK_CANARY] | 745 | ldr r7, [r7, #TSK_STACK_CANARY] |
746 | #endif | 746 | #endif |
747 | #ifdef CONFIG_MMU | 747 | #ifdef CONFIG_CPU_USE_DOMAINS |
748 | mcr p15, 0, r6, c3, c0, 0 @ Set domain register | 748 | mcr p15, 0, r6, c3, c0, 0 @ Set domain register |
749 | #endif | 749 | #endif |
750 | mov r5, r0 | 750 | mov r5, r0 |
diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c index 6ff7919613d7..d601ef297eb6 100644 --- a/arch/arm/kernel/fiq.c +++ b/arch/arm/kernel/fiq.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <asm/fiq.h> | 45 | #include <asm/fiq.h> |
46 | #include <asm/irq.h> | 46 | #include <asm/irq.h> |
47 | #include <asm/system.h> | 47 | #include <asm/system.h> |
48 | #include <asm/traps.h> | ||
48 | 49 | ||
49 | static unsigned long no_fiq_insn; | 50 | static unsigned long no_fiq_insn; |
50 | 51 | ||
@@ -77,7 +78,11 @@ int show_fiq_list(struct seq_file *p, void *v) | |||
77 | 78 | ||
78 | void set_fiq_handler(void *start, unsigned int length) | 79 | void set_fiq_handler(void *start, unsigned int length) |
79 | { | 80 | { |
81 | #if defined(CONFIG_CPU_USE_DOMAINS) | ||
80 | memcpy((void *)0xffff001c, start, length); | 82 | memcpy((void *)0xffff001c, start, length); |
83 | #else | ||
84 | memcpy(vectors_page + 0x1c, start, length); | ||
85 | #endif | ||
81 | flush_icache_range(0xffff001c, 0xffff001c + length); | 86 | flush_icache_range(0xffff001c, 0xffff001c + length); |
82 | if (!vectors_high()) | 87 | if (!vectors_high()) |
83 | flush_icache_range(0x1c, 0x1c + length); | 88 | flush_icache_range(0x1c, 0x1c + length); |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index cda78d59aa31..87abca018054 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -37,6 +37,8 @@ | |||
37 | 37 | ||
38 | static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" }; | 38 | static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" }; |
39 | 39 | ||
40 | void *vectors_page; | ||
41 | |||
40 | #ifdef CONFIG_DEBUG_USER | 42 | #ifdef CONFIG_DEBUG_USER |
41 | unsigned int user_debug; | 43 | unsigned int user_debug; |
42 | 44 | ||
@@ -759,7 +761,11 @@ static void __init kuser_get_tls_init(unsigned long vectors) | |||
759 | 761 | ||
760 | void __init early_trap_init(void) | 762 | void __init early_trap_init(void) |
761 | { | 763 | { |
764 | #if defined(CONFIG_CPU_USE_DOMAINS) | ||
762 | unsigned long vectors = CONFIG_VECTORS_BASE; | 765 | unsigned long vectors = CONFIG_VECTORS_BASE; |
766 | #else | ||
767 | unsigned long vectors = (unsigned long)vectors_page; | ||
768 | #endif | ||
763 | extern char __stubs_start[], __stubs_end[]; | 769 | extern char __stubs_start[], __stubs_end[]; |
764 | extern char __vectors_start[], __vectors_end[]; | 770 | extern char __vectors_start[], __vectors_end[]; |
765 | extern char __kuser_helper_start[], __kuser_helper_end[]; | 771 | extern char __kuser_helper_start[], __kuser_helper_end[]; |
@@ -783,10 +789,10 @@ void __init early_trap_init(void) | |||
783 | * Copy signal return handlers into the vector page, and | 789 | * Copy signal return handlers into the vector page, and |
784 | * set sigreturn to be a pointer to these. | 790 | * set sigreturn to be a pointer to these. |
785 | */ | 791 | */ |
786 | memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes, | 792 | memcpy((void *)(vectors + KERN_SIGRETURN_CODE - CONFIG_VECTORS_BASE), |
787 | sizeof(sigreturn_codes)); | 793 | sigreturn_codes, sizeof(sigreturn_codes)); |
788 | memcpy((void *)KERN_RESTART_CODE, syscall_restart_code, | 794 | memcpy((void *)(vectors + KERN_RESTART_CODE - CONFIG_VECTORS_BASE), |
789 | sizeof(syscall_restart_code)); | 795 | syscall_restart_code, sizeof(syscall_restart_code)); |
790 | 796 | ||
791 | flush_icache_range(vectors, vectors + PAGE_SIZE); | 797 | flush_icache_range(vectors, vectors + PAGE_SIZE); |
792 | modify_domain(DOMAIN_USER, DOMAIN_CLIENT); | 798 | modify_domain(DOMAIN_USER, DOMAIN_CLIENT); |