summary refs log tree commit diff stats
path: root/hw/arm_boot.c
diff options
context:
space:
mode:
authorbalrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162>2007-04-30 02:24:42 +0000
committerbalrog <balrog@c046a42c-6fe2-441c-8c8c-71466251a162>2007-04-30 02:24:42 +0000
commit9d55199763d4067158d6c556e78312f7d007d914 (patch)
treee1ee7532b8bb77430321354484852fa6ea403eae /hw/arm_boot.c
parentb00052e496395a9cd38b7efb558aa78855a1e179 (diff)
downloadfocaccia-qemu-9d55199763d4067158d6c556e78312f7d007d914.tar.gz
focaccia-qemu-9d55199763d4067158d6c556e78312f7d007d914.zip
Account for machine with RAM which is not mapped at 0x0 in arm_boot.c.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2757 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw/arm_boot.c')
-rw-r--r--hw/arm_boot.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/hw/arm_boot.c b/hw/arm_boot.c
index 095b0bb79f..ed3ec5830e 100644
--- a/hw/arm_boot.c
+++ b/hw/arm_boot.c
@@ -32,11 +32,12 @@ static void main_cpu_reset(void *opaque)
     if (env->kernel_filename)
         arm_load_kernel(env, env->ram_size, env->kernel_filename, 
                         env->kernel_cmdline, env->initrd_filename, 
-                        env->board_id);
+                        env->board_id, env->loader_start);
 }
 
 static void set_kernel_args(uint32_t ram_size, int initrd_size,
-                            const char *kernel_cmdline)
+                            const char *kernel_cmdline,
+                            target_phys_addr_t loader_start)
 {
     uint32_t *p;
 
@@ -51,12 +52,12 @@ static void set_kernel_args(uint32_t ram_size, int initrd_size,
     stl_raw(p++, 4);
     stl_raw(p++, 0x54410002);
     stl_raw(p++, ram_size);
-    stl_raw(p++, 0);
+    stl_raw(p++, loader_start);
     if (initrd_size) {
         /* ATAG_INITRD2 */
         stl_raw(p++, 4);
         stl_raw(p++, 0x54420005);
-        stl_raw(p++, INITRD_LOAD_ADDR);
+        stl_raw(p++, loader_start + INITRD_LOAD_ADDR);
         stl_raw(p++, initrd_size);
     }
     if (kernel_cmdline && *kernel_cmdline) {
@@ -77,7 +78,7 @@ static void set_kernel_args(uint32_t ram_size, int initrd_size,
 
 void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
                      const char *kernel_cmdline, const char *initrd_filename,
-                     int board_id)
+                     int board_id, target_phys_addr_t loader_start)
 {
     int kernel_size;
     int initrd_size;
@@ -98,6 +99,7 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
         env->kernel_cmdline = kernel_cmdline;
         env->initrd_filename = initrd_filename;
         env->board_id = board_id;
+        env->loader_start = loader_start;
         qemu_register_reset(main_cpu_reset, env);
     }
     /* Assume that raw images are linux kernels, and ELF images are not.  */
@@ -109,7 +111,7 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
     if (kernel_size < 0) {
         kernel_size = load_image(kernel_filename,
                                  phys_ram_base + KERNEL_LOAD_ADDR);
-        entry = KERNEL_LOAD_ADDR;
+        entry = loader_start + KERNEL_LOAD_ADDR;
         is_linux = 1;
     }
     if (kernel_size < 0) {
@@ -134,11 +136,10 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
         }
         bootloader[1] |= board_id & 0xff;
         bootloader[2] |= (board_id >> 8) & 0xff;
-        bootloader[5] = KERNEL_ARGS_ADDR;
+        bootloader[5] = loader_start + KERNEL_ARGS_ADDR;
         bootloader[6] = entry;
         for (n = 0; n < sizeof(bootloader) / 4; n++)
             stl_raw(phys_ram_base + (n * 4), bootloader[n]);
-        set_kernel_args(ram_size, initrd_size, kernel_cmdline);
+        set_kernel_args(ram_size, initrd_size, kernel_cmdline, loader_start);
     }
 }
-