diff options
Diffstat (limited to 'arch/arm/kernel/traps.c')
-rw-r--r-- | arch/arm/kernel/traps.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 6e31718f6008..0078aeb85737 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -578,9 +578,16 @@ EXPORT_SYMBOL(abort); | |||
578 | 578 | ||
579 | void __init trap_init(void) | 579 | void __init trap_init(void) |
580 | { | 580 | { |
581 | extern void __trap_init(void); | 581 | extern char __stubs_start[], __stubs_end[]; |
582 | extern char __vectors_start[], __vectors_end[]; | ||
582 | 583 | ||
583 | __trap_init(); | 584 | /* |
585 | * Copy the vectors and stubs (in entry-armv.S) into the | ||
586 | * vector page, mapped at 0xffff0000, and ensure these are | ||
587 | * visible to the instruction stream. | ||
588 | */ | ||
589 | memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start); | ||
590 | memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start); | ||
584 | flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE); | 591 | flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE); |
585 | modify_domain(DOMAIN_USER, DOMAIN_CLIENT); | 592 | modify_domain(DOMAIN_USER, DOMAIN_CLIENT); |
586 | } | 593 | } |