aboutsummaryrefslogtreecommitdiffstats
path: root/arch/microblaze
diff options
context:
space:
mode:
authorMichal Simek <monstr@monstr.eu>2010-11-08 06:37:40 -0500
committerMichal Simek <monstr@monstr.eu>2011-03-15 05:59:00 -0400
commit0b9b0200b0922c29dc251b99700f96dade92214a (patch)
tree23aa052508da168745cddca2a650e1627e29ec4d /arch/microblaze
parent7574349cee0b1cddc0aa1104d9b2fc5152d318d9 (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/Kconfig11
-rw-r--r--arch/microblaze/kernel/entry.S7
-rw-r--r--arch/microblaze/kernel/setup.c12
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
187config 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
187config KERNEL_START_BOOL 198config 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)
95void __init machine_early_init(const char *cmdline, unsigned int ram, 95void __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 */