diff options
-rw-r--r-- | arch/arm/Kconfig | 8 | ||||
-rw-r--r-- | arch/arm/Kconfig-nommu | 17 | ||||
-rw-r--r-- | arch/arm/kernel/signal.h | 2 | ||||
-rw-r--r-- | arch/arm/kernel/traps.c | 9 |
4 files changed, 31 insertions, 5 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 32ba00bd0a2f..b674614d090b 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -72,6 +72,14 @@ config FIQ | |||
72 | config ARCH_MTD_XIP | 72 | config ARCH_MTD_XIP |
73 | bool | 73 | bool |
74 | 74 | ||
75 | config VECTORS_BASE | ||
76 | hex | ||
77 | default 0xffff0000 if MMU | ||
78 | default DRAM_BASE if REMAP_VECTORS_TO_RAM | ||
79 | default 0x00000000 | ||
80 | help | ||
81 | The base address of exception vectors. | ||
82 | |||
75 | source "init/Kconfig" | 83 | source "init/Kconfig" |
76 | 84 | ||
77 | menu "System Type" | 85 | menu "System Type" |
diff --git a/arch/arm/Kconfig-nommu b/arch/arm/Kconfig-nommu index 8ce56e5bd78f..e1574be2ded6 100644 --- a/arch/arm/Kconfig-nommu +++ b/arch/arm/Kconfig-nommu | |||
@@ -25,3 +25,20 @@ config FLASH_SIZE | |||
25 | hex 'FLASH Size' if SET_MEM_PARAM | 25 | hex 'FLASH Size' if SET_MEM_PARAM |
26 | default 0x00400000 | 26 | default 0x00400000 |
27 | 27 | ||
28 | config REMAP_VECTORS_TO_RAM | ||
29 | bool 'Install vectors to the begining of RAM' if DRAM_BASE | ||
30 | depends on DRAM_BASE | ||
31 | help | ||
32 | The kernel needs to change the hardware exception vectors. | ||
33 | In nommu mode, the hardware exception vectors are normally | ||
34 | placed at address 0x00000000. However, this region may be | ||
35 | occupied by read-only memory depending on H/W design. | ||
36 | |||
37 | If the region contains read-write memory, say 'n' here. | ||
38 | |||
39 | If your CPU provides a remap facility which allows the exception | ||
40 | vectors to be mapped to writable memory, say 'n' here. | ||
41 | |||
42 | Otherwise, say 'y' here. In this case, the kernel will require | ||
43 | external support to redirect the hardware exception vectors to | ||
44 | the writable versions located at DRAM_BASE. | ||
diff --git a/arch/arm/kernel/signal.h b/arch/arm/kernel/signal.h index 9991049c522d..27beece15502 100644 --- a/arch/arm/kernel/signal.h +++ b/arch/arm/kernel/signal.h | |||
@@ -7,6 +7,6 @@ | |||
7 | * it under the terms of the GNU General Public License version 2 as | 7 | * it under the terms of the GNU General Public License version 2 as |
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | #define KERN_SIGRETURN_CODE 0xffff0500 | 10 | #define KERN_SIGRETURN_CODE (CONFIG_VECTORS_BASE + 0x00000500) |
11 | 11 | ||
12 | extern const unsigned long sigreturn_codes[7]; | 12 | extern const unsigned long sigreturn_codes[7]; |
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 03924bcc6129..32b0570329e7 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c | |||
@@ -688,6 +688,7 @@ EXPORT_SYMBOL(abort); | |||
688 | 688 | ||
689 | void __init trap_init(void) | 689 | void __init trap_init(void) |
690 | { | 690 | { |
691 | unsigned long vectors = CONFIG_VECTORS_BASE; | ||
691 | extern char __stubs_start[], __stubs_end[]; | 692 | extern char __stubs_start[], __stubs_end[]; |
692 | extern char __vectors_start[], __vectors_end[]; | 693 | extern char __vectors_start[], __vectors_end[]; |
693 | extern char __kuser_helper_start[], __kuser_helper_end[]; | 694 | extern char __kuser_helper_start[], __kuser_helper_end[]; |
@@ -698,9 +699,9 @@ void __init trap_init(void) | |||
698 | * into the vector page, mapped at 0xffff0000, and ensure these | 699 | * into the vector page, mapped at 0xffff0000, and ensure these |
699 | * are visible to the instruction stream. | 700 | * are visible to the instruction stream. |
700 | */ | 701 | */ |
701 | memcpy((void *)0xffff0000, __vectors_start, __vectors_end - __vectors_start); | 702 | memcpy((void *)vectors, __vectors_start, __vectors_end - __vectors_start); |
702 | memcpy((void *)0xffff0200, __stubs_start, __stubs_end - __stubs_start); | 703 | memcpy((void *)vectors + 0x200, __stubs_start, __stubs_end - __stubs_start); |
703 | memcpy((void *)0xffff1000 - kuser_sz, __kuser_helper_start, kuser_sz); | 704 | memcpy((void *)vectors + 0x1000 - kuser_sz, __kuser_helper_start, kuser_sz); |
704 | 705 | ||
705 | /* | 706 | /* |
706 | * Copy signal return handlers into the vector page, and | 707 | * Copy signal return handlers into the vector page, and |
@@ -709,6 +710,6 @@ void __init trap_init(void) | |||
709 | memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes, | 710 | memcpy((void *)KERN_SIGRETURN_CODE, sigreturn_codes, |
710 | sizeof(sigreturn_codes)); | 711 | sizeof(sigreturn_codes)); |
711 | 712 | ||
712 | flush_icache_range(0xffff0000, 0xffff0000 + PAGE_SIZE); | 713 | flush_icache_range(vectors, vectors + PAGE_SIZE); |
713 | modify_domain(DOMAIN_USER, DOMAIN_CLIENT); | 714 | modify_domain(DOMAIN_USER, DOMAIN_CLIENT); |
714 | } | 715 | } |