Commit 0b9b0200 authored by Michal Simek's avatar Michal Simek

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: default avatarMichal Simek <monstr@monstr.eu>
Signed-off-by: default avatarJohn Williams <john.williams@petalogix.com>
parent 7574349c
...@@ -184,6 +184,17 @@ config LOWMEM_SIZE ...@@ -184,6 +184,17 @@ config LOWMEM_SIZE
hex "Maximum low memory size (in bytes)" if LOWMEM_SIZE_BOOL hex "Maximum low memory size (in bytes)" if LOWMEM_SIZE_BOOL
default "0x30000000" 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 config KERNEL_START_BOOL
bool "Set custom kernel base address" bool "Set custom kernel base address"
depends on ADVANCED_OPTIONS depends on ADVANCED_OPTIONS
......
...@@ -993,11 +993,10 @@ ENTRY(_reset) ...@@ -993,11 +993,10 @@ ENTRY(_reset)
/* These are compiled and loaded into high memory, then /* These are compiled and loaded into high memory, then
* copied into place in mach_early_setup */ * copied into place in mach_early_setup */
.section .init.ivt, "ax" .section .init.ivt, "ax"
#if CONFIG_MANUAL_RESET_VECTOR
.org 0x0 .org 0x0
/* this is very important - here is the reset vector */ brai CONFIG_MANUAL_RESET_VECTOR
/* in current MMU branch you don't care what is here - it is #endif
* used from bootloader site - but this is correct for FS-BOOT */
brai 0x70
.org 0x8 .org 0x8
brai TOPHYS(_user_exception); /* syscall handler */ brai TOPHYS(_user_exception); /* syscall handler */
.org 0x10 .org 0x10
......
...@@ -95,7 +95,8 @@ inline unsigned get_romfs_len(unsigned *addr) ...@@ -95,7 +95,8 @@ inline unsigned get_romfs_len(unsigned *addr)
void __init machine_early_init(const char *cmdline, unsigned int ram, void __init machine_early_init(const char *cmdline, unsigned int ram,
unsigned int fdt, unsigned int msr) 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 /* If CONFIG_MTD_UCLINUX is defined, assume ROMFS is at the
* end of kernel. There are two position which we want to check. * 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,7 +169,14 @@ void __init machine_early_init(const char *cmdline, unsigned int ram,
"CPU have it %x\n", msr); "CPU have it %x\n", msr);
#endif #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; *dst = *src;
/* Initialize global data */ /* Initialize global data */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment