summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Munch <lars@segv.dk>2010-05-08 22:43:35 +0200
committerAurelien Jarno <aurelien@aurel32.net>2010-05-31 19:40:41 +0200
commite03c22a98cf5deffd0dec2f9ff88a600aa330bc4 (patch)
treedbb06162b962ef194e422e40641d559b31087662
parent0f89cc7b6c33418f268126cc908b222e0d052f69 (diff)
arm: fix arm kernel boot for non zero start addr
Booting an arm kernel has been broken a while when booting from non zero start address. This is due to the order of events: board init loads the kernel and sets register 15 to the start address and then qemu_system_reset reset the cpu making register 15 zero again. This patch fixes the usage of the register 15 start address trick in combination with arm_load_kernel. Signed-off-by: Lars Munch <lars@segv.dk> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
-rw-r--r--hw/arm_boot.c1
-rw-r--r--hw/gumstix.c4
-rw-r--r--hw/mainstone.c3
-rw-r--r--hw/nseries.c7
-rw-r--r--hw/omap_sx1.c5
-rw-r--r--hw/palm.c4
-rw-r--r--hw/spitz.c3
-rw-r--r--hw/tosa.c3
-rw-r--r--target-arm/helper.c1
9 files changed, 1 insertions, 30 deletions
diff --git a/hw/arm_boot.c b/hw/arm_boot.c
index df031a595..620550b5a 100644
--- a/hw/arm_boot.c
+++ b/hw/arm_boot.c
@@ -187,6 +187,7 @@ static void main_cpu_reset(void *opaque)
env->regs[15] = info->entry & 0xfffffffe;
env->thumb = info->entry & 1;
} else {
+ env->regs[15] = info->loader_start;
if (old_param) {
set_kernel_args_old(info, info->initrd_size,
info->loader_start);
diff --git a/hw/gumstix.c b/hw/gumstix.c
index 3fd31f4bf..b64e04e20 100644
--- a/hw/gumstix.c
+++ b/hw/gumstix.c
@@ -74,8 +74,6 @@ static void connex_init(ram_addr_t ram_size,
exit(1);
}
- cpu->env->regs[15] = 0x00000000;
-
/* Interrupt line of NIC is connected to GPIO line 36 */
smc91c111_init(&nd_table[0], 0x04000300,
pxa2xx_gpio_in_get(cpu->gpio)[36]);
@@ -114,8 +112,6 @@ static void verdex_init(ram_addr_t ram_size,
exit(1);
}
- cpu->env->regs[15] = 0x00000000;
-
/* Interrupt line of NIC is connected to GPIO line 99 */
smc91c111_init(&nd_table[0], 0x04000300,
pxa2xx_gpio_in_get(cpu->gpio)[99]);
diff --git a/hw/mainstone.c b/hw/mainstone.c
index a4379e3ec..54bacfb9d 100644
--- a/hw/mainstone.c
+++ b/hw/mainstone.c
@@ -89,9 +89,6 @@ static void mainstone_common_init(ram_addr_t ram_size,
cpu_register_physical_memory(0, MAINSTONE_ROM,
qemu_ram_alloc(MAINSTONE_ROM) | IO_MEM_ROM);
- /* Setup initial (reset) machine state */
- cpu->env->regs[15] = mainstone_binfo.loader_start;
-
#ifdef TARGET_WORDS_BIGENDIAN
be = 1;
#else
diff --git a/hw/nseries.c b/hw/nseries.c
index 0273eeea3..04a028dc2 100644
--- a/hw/nseries.c
+++ b/hw/nseries.c
@@ -1016,7 +1016,6 @@ static void n8x0_boot_init(void *opaque)
n800_dss_init(&s->blizzard);
/* CPU setup */
- s->cpu->env->regs[15] = s->cpu->env->boot_info->loader_start;
s->cpu->env->GE = 0x5;
/* If the machine has a slided keyboard, open it */
@@ -1317,11 +1316,6 @@ static void n8x0_init(ram_addr_t ram_size, const char *boot_device,
if (usb_enabled)
n8x0_usb_setup(s);
- /* Setup initial (reset) machine state */
-
- /* Start at the OneNAND bootloader. */
- s->cpu->env->regs[15] = 0;
-
if (kernel_filename) {
/* Or at the linux loader. */
binfo->kernel_filename = kernel_filename;
@@ -1330,7 +1324,6 @@ static void n8x0_init(ram_addr_t ram_size, const char *boot_device,
arm_load_kernel(s->cpu->env, binfo);
qemu_register_reset(n8x0_boot_init, s);
- n8x0_boot_init(s);
}
if (option_rom[0] && (boot_device[0] == 'n' || !kernel_filename)) {
diff --git a/hw/omap_sx1.c b/hw/omap_sx1.c
index ca0a7d100..2e9879f0e 100644
--- a/hw/omap_sx1.c
+++ b/hw/omap_sx1.c
@@ -195,15 +195,10 @@ static void sx1_init(ram_addr_t ram_size,
/* Load the kernel. */
if (kernel_filename) {
- /* Start at bootloader. */
- cpu->env->regs[15] = sx1_binfo.loader_start;
-
sx1_binfo.kernel_filename = kernel_filename;
sx1_binfo.kernel_cmdline = kernel_cmdline;
sx1_binfo.initrd_filename = initrd_filename;
arm_load_kernel(cpu->env, &sx1_binfo);
- } else {
- cpu->env->regs[15] = 0x00000000;
}
/* TODO: fix next line */
diff --git a/hw/palm.c b/hw/palm.c
index ba7c398a1..8db133d09 100644
--- a/hw/palm.c
+++ b/hw/palm.c
@@ -243,7 +243,6 @@ static void palmte_init(ram_addr_t ram_size,
rom_size = load_image_targphys(option_rom[0], OMAP_CS0_BASE,
flash_size);
rom_loaded = 1;
- cpu->env->regs[15] = 0x00000000;
}
if (rom_size < 0) {
fprintf(stderr, "%s: error loading '%s'\n",
@@ -258,9 +257,6 @@ static void palmte_init(ram_addr_t ram_size,
/* Load the kernel. */
if (kernel_filename) {
- /* Start at bootloader. */
- cpu->env->regs[15] = palmte_binfo.loader_start;
-
palmte_binfo.kernel_filename = kernel_filename;
palmte_binfo.kernel_cmdline = kernel_cmdline;
palmte_binfo.initrd_filename = initrd_filename;
diff --git a/hw/spitz.c b/hw/spitz.c
index c3b5cd8e4..4f82e2449 100644
--- a/hw/spitz.c
+++ b/hw/spitz.c
@@ -993,9 +993,6 @@ static void spitz_common_init(ram_addr_t ram_size,
/* A 4.0 GB microdrive is permanently sitting in CF slot 0. */
spitz_microdrive_attach(cpu, 0);
- /* Setup initial (reset) machine state */
- cpu->env->regs[15] = spitz_binfo.loader_start;
-
spitz_binfo.kernel_filename = kernel_filename;
spitz_binfo.kernel_cmdline = kernel_cmdline;
spitz_binfo.initrd_filename = initrd_filename;
diff --git a/hw/tosa.c b/hw/tosa.c
index bc6591f06..fbe8d8c69 100644
--- a/hw/tosa.c
+++ b/hw/tosa.c
@@ -229,9 +229,6 @@ static void tosa_init(ram_addr_t ram_size,
tosa_tg_init(cpu);
- /* Setup initial (reset) machine state */
- cpu->env->regs[15] = tosa_binfo.loader_start;
-
tosa_binfo.kernel_filename = kernel_filename;
tosa_binfo.kernel_cmdline = kernel_cmdline;
tosa_binfo.initrd_filename = initrd_filename;
diff --git a/target-arm/helper.c b/target-arm/helper.c
index 99e0394e9..63e5dc7ef 100644
--- a/target-arm/helper.c
+++ b/target-arm/helper.c
@@ -207,7 +207,6 @@ void cpu_reset(CPUARMState *env)
#else
/* SVC mode with interrupts disabled. */
env->uncached_cpsr = ARM_CPU_MODE_SVC | CPSR_A | CPSR_F | CPSR_I;
- env->regs[15] = 0;
/* On ARMv7-M the CPSR_I is the value of the PRIMASK register, and is
clear at reset. Initial SP and PC are loaded from ROM. */
if (IS_M(env)) {