diff options
author | Michal Simek <monstr@monstr.eu> | 2010-11-08 06:37:40 -0500 |
---|---|---|
committer | Michal Simek <monstr@monstr.eu> | 2011-03-15 05:59:00 -0400 |
commit | 0b9b0200b0922c29dc251b99700f96dade92214a (patch) | |
tree | 23aa052508da168745cddca2a650e1627e29ec4d /arch/microblaze | |
parent | 7574349cee0b1cddc0aa1104d9b2fc5152d318d9 (diff) |
microblaze: Do not copy reset vectors/manual reset vector setup
Reset vector can be setup by bootloader and kernel doens't need
to touch it. If you require to setup reset vector, please use
CONFIG_MANUAL_RESET_VECTOR throught menuconfig.
It is not possible to setup address 0x0 as reset address because
make no sense to set it up at all.
Signed-off-by: Michal Simek <monstr@monstr.eu>
Signed-off-by: John Williams <john.williams@petalogix.com>
Diffstat (limited to 'arch/microblaze')
-rw-r--r-- | arch/microblaze/Kconfig | 11 | ||||
-rw-r--r-- | arch/microblaze/kernel/entry.S | 7 | ||||
-rw-r--r-- | arch/microblaze/kernel/setup.c | 12 |
3 files changed, 24 insertions, 6 deletions
diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index 050aca35aca2..922c4194c7bb 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig | |||
@@ -184,6 +184,17 @@ config LOWMEM_SIZE | |||
184 | hex "Maximum low memory size (in bytes)" if LOWMEM_SIZE_BOOL | 184 | hex "Maximum low memory size (in bytes)" if LOWMEM_SIZE_BOOL |
185 | default "0x30000000" | 185 | default "0x30000000" |
186 | 186 | ||
187 | config MANUAL_RESET_VECTOR | ||
188 | hex "Microblaze reset vector address setup" | ||
189 | default "0x0" | ||
190 | help | ||
191 | Set this option to have the kernel override the CPU Reset vector. | ||
192 | If zero, no change will be made to the MicroBlaze reset vector at | ||
193 | address 0x0. | ||
194 | If non-zero, a jump instruction to this address, will be written | ||
195 | to the reset vector at address 0x0. | ||
196 | If you are unsure, set it to default value 0x0. | ||
197 | |||
187 | config KERNEL_START_BOOL | 198 | config KERNEL_START_BOOL |
188 | bool "Set custom kernel base address" | 199 | bool "Set custom kernel base address" |
189 | depends on ADVANCED_OPTIONS | 200 | depends on ADVANCED_OPTIONS |
diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S index 6b4052459d5a..ca15bc5c7449 100644 --- a/arch/microblaze/kernel/entry.S +++ b/arch/microblaze/kernel/entry.S | |||
@@ -993,11 +993,10 @@ ENTRY(_reset) | |||
993 | /* These are compiled and loaded into high memory, then | 993 | /* These are compiled and loaded into high memory, then |
994 | * copied into place in mach_early_setup */ | 994 | * copied into place in mach_early_setup */ |
995 | .section .init.ivt, "ax" | 995 | .section .init.ivt, "ax" |
996 | #if CONFIG_MANUAL_RESET_VECTOR | ||
996 | .org 0x0 | 997 | .org 0x0 |
997 | /* this is very important - here is the reset vector */ | 998 | brai CONFIG_MANUAL_RESET_VECTOR |
998 | /* in current MMU branch you don't care what is here - it is | 999 | #endif |
999 | * used from bootloader site - but this is correct for FS-BOOT */ | ||
1000 | brai 0x70 | ||
1001 | .org 0x8 | 1000 | .org 0x8 |
1002 | brai TOPHYS(_user_exception); /* syscall handler */ | 1001 | brai TOPHYS(_user_exception); /* syscall handler */ |
1003 | .org 0x10 | 1002 | .org 0x10 |
diff --git a/arch/microblaze/kernel/setup.c b/arch/microblaze/kernel/setup.c index 9312fbb37efd..8e2c09b7ff26 100644 --- a/arch/microblaze/kernel/setup.c +++ b/arch/microblaze/kernel/setup.c | |||
@@ -95,7 +95,8 @@ inline unsigned get_romfs_len(unsigned *addr) | |||
95 | void __init machine_early_init(const char *cmdline, unsigned int ram, | 95 | void __init machine_early_init(const char *cmdline, unsigned int ram, |
96 | unsigned int fdt, unsigned int msr) | 96 | unsigned int fdt, unsigned int msr) |
97 | { | 97 | { |
98 | unsigned long *src, *dst = (unsigned long *)0x0; | 98 | unsigned long *src, *dst; |
99 | unsigned int offset = 0; | ||
99 | 100 | ||
100 | /* If CONFIG_MTD_UCLINUX is defined, assume ROMFS is at the | 101 | /* If CONFIG_MTD_UCLINUX is defined, assume ROMFS is at the |
101 | * end of kernel. There are two position which we want to check. | 102 | * end of kernel. There are two position which we want to check. |
@@ -168,7 +169,14 @@ void __init machine_early_init(const char *cmdline, unsigned int ram, | |||
168 | "CPU have it %x\n", msr); | 169 | "CPU have it %x\n", msr); |
169 | #endif | 170 | #endif |
170 | 171 | ||
171 | for (src = __ivt_start; src < __ivt_end; src++, dst++) | 172 | /* Do not copy reset vectors. offset = 0x2 means skip the first |
173 | * two instructions. dst is pointer to MB vectors which are placed | ||
174 | * in block ram. If you want to copy reset vector setup offset to 0x0 */ | ||
175 | #if !CONFIG_MANUAL_RESET_VECTOR | ||
176 | offset = 0x2; | ||
177 | #endif | ||
178 | dst = (unsigned long *) (offset * sizeof(u32)); | ||
179 | for (src = __ivt_start + offset; src < __ivt_end; src++, dst++) | ||
172 | *dst = *src; | 180 | *dst = *src; |
173 | 181 | ||
174 | /* Initialize global data */ | 182 | /* Initialize global data */ |