microblaze: Do not copy reset vectors/manual reset vector setup
authorMichal Simek <monstr@monstr.eu>
Mon, 8 Nov 2010 11:37:40 +0000 (12:37 +0100)
committerMichal Simek <monstr@monstr.eu>
Tue, 15 Mar 2011 09:59:00 +0000 (10:59 +0100)
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>
arch/microblaze/Kconfig
arch/microblaze/kernel/entry.S
arch/microblaze/kernel/setup.c

index 050aca3..922c419 100644 (file)
@@ -184,6 +184,17 @@ config LOWMEM_SIZE
        hex "Maximum low memory size (in bytes)" if LOWMEM_SIZE_BOOL
        default "0x30000000"
 
+config MANUAL_RESET_VECTOR
+       hex "Microblaze reset vector address setup"
+       default "0x0"
+       help
+         Set this option to have the kernel override the CPU Reset vector.
+         If zero, no change will be made to the MicroBlaze reset vector at
+         address 0x0.
+         If non-zero, a jump instruction to this address, will be written
+         to the reset vector at address 0x0.
+         If you are unsure, set it to default value 0x0.
+
 config KERNEL_START_BOOL
        bool "Set custom kernel base address"
        depends on ADVANCED_OPTIONS
index 6b40524..ca15bc5 100644 (file)
@@ -993,11 +993,10 @@ ENTRY(_reset)
        /* These are compiled and loaded into high memory, then
         * copied into place in mach_early_setup */
        .section        .init.ivt, "ax"
+#if CONFIG_MANUAL_RESET_VECTOR
        .org    0x0
-       /* this is very important - here is the reset vector */
-       /* in current MMU branch you don't care what is here - it is
-        * used from bootloader site - but this is correct for FS-BOOT */
-       brai    0x70
+       brai    CONFIG_MANUAL_RESET_VECTOR
+#endif
        .org    0x8
        brai    TOPHYS(_user_exception); /* syscall handler */
        .org    0x10
index 9312fbb..8e2c09b 100644 (file)
@@ -95,7 +95,8 @@ inline unsigned get_romfs_len(unsigned *addr)
 void __init machine_early_init(const char *cmdline, unsigned int ram,
                unsigned int fdt, unsigned int msr)
 {
-       unsigned long *src, *dst = (unsigned long *)0x0;
+       unsigned long *src, *dst;
+       unsigned int offset = 0;
 
        /* If CONFIG_MTD_UCLINUX is defined, assume ROMFS is at the
         * 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,
                                "CPU have it %x\n", msr);
 #endif
 
-       for (src = __ivt_start; src < __ivt_end; src++, dst++)
+       /* Do not copy reset vectors. offset = 0x2 means skip the first
+        * two instructions. dst is pointer to MB vectors which are placed
+        * in block ram. If you want to copy reset vector setup offset to 0x0 */
+#if !CONFIG_MANUAL_RESET_VECTOR
+       offset = 0x2;
+#endif
+       dst = (unsigned long *) (offset * sizeof(u32));
+       for (src = __ivt_start + offset; src < __ivt_end; src++, dst++)
                *dst = *src;
 
        /* Initialize global data */