aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kernel')
-rw-r--r--arch/arm/kernel/entry-armv.S4
-rw-r--r--arch/arm/kernel/fiq.c5
-rw-r--r--arch/arm/kernel/traps.c14
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
49static unsigned long no_fiq_insn; 50static unsigned long no_fiq_insn;
50 51
@@ -77,7 +78,11 @@ int show_fiq_list(struct seq_file *p, void *v)
77 78
78void set_fiq_handler(void *start, unsigned int length) 79void 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
38static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" }; 38static const char *handler[]= { "prefetch abort", "data abort", "address exception", "interrupt" };
39 39
40void *vectors_page;
41
40#ifdef CONFIG_DEBUG_USER 42#ifdef CONFIG_DEBUG_USER
41unsigned int user_debug; 43unsigned int user_debug;
42 44
@@ -759,7 +761,11 @@ static void __init kuser_get_tls_init(unsigned long vectors)
759 761
760void __init early_trap_init(void) 762void __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);