Commit 9d55199763d4067158d6c556e78312f7d007d914

Authored by balrog
1 parent b00052e4

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
hw/arm_boot.c
@@ -32,11 +32,12 @@ static void main_cpu_reset(void *opaque) @@ -32,11 +32,12 @@ static void main_cpu_reset(void *opaque)
32 if (env->kernel_filename) 32 if (env->kernel_filename)
33 arm_load_kernel(env, env->ram_size, env->kernel_filename, 33 arm_load_kernel(env, env->ram_size, env->kernel_filename,
34 env->kernel_cmdline, env->initrd_filename, 34 env->kernel_cmdline, env->initrd_filename,
35 - env->board_id); 35 + env->board_id, env->loader_start);
36 } 36 }
37 37
38 static void set_kernel_args(uint32_t ram_size, int initrd_size, 38 static void set_kernel_args(uint32_t ram_size, int initrd_size,
39 - const char *kernel_cmdline) 39 + const char *kernel_cmdline,
  40 + target_phys_addr_t loader_start)
40 { 41 {
41 uint32_t *p; 42 uint32_t *p;
42 43
@@ -51,12 +52,12 @@ static void set_kernel_args(uint32_t ram_size, int initrd_size, @@ -51,12 +52,12 @@ static void set_kernel_args(uint32_t ram_size, int initrd_size,
51 stl_raw(p++, 4); 52 stl_raw(p++, 4);
52 stl_raw(p++, 0x54410002); 53 stl_raw(p++, 0x54410002);
53 stl_raw(p++, ram_size); 54 stl_raw(p++, ram_size);
54 - stl_raw(p++, 0); 55 + stl_raw(p++, loader_start);
55 if (initrd_size) { 56 if (initrd_size) {
56 /* ATAG_INITRD2 */ 57 /* ATAG_INITRD2 */
57 stl_raw(p++, 4); 58 stl_raw(p++, 4);
58 stl_raw(p++, 0x54420005); 59 stl_raw(p++, 0x54420005);
59 - stl_raw(p++, INITRD_LOAD_ADDR); 60 + stl_raw(p++, loader_start + INITRD_LOAD_ADDR);
60 stl_raw(p++, initrd_size); 61 stl_raw(p++, initrd_size);
61 } 62 }
62 if (kernel_cmdline && *kernel_cmdline) { 63 if (kernel_cmdline && *kernel_cmdline) {
@@ -77,7 +78,7 @@ static void set_kernel_args(uint32_t ram_size, int initrd_size, @@ -77,7 +78,7 @@ static void set_kernel_args(uint32_t ram_size, int initrd_size,
77 78
78 void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename, 79 void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
79 const char *kernel_cmdline, const char *initrd_filename, 80 const char *kernel_cmdline, const char *initrd_filename,
80 - int board_id) 81 + int board_id, target_phys_addr_t loader_start)
81 { 82 {
82 int kernel_size; 83 int kernel_size;
83 int initrd_size; 84 int initrd_size;
@@ -98,6 +99,7 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename, @@ -98,6 +99,7 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
98 env->kernel_cmdline = kernel_cmdline; 99 env->kernel_cmdline = kernel_cmdline;
99 env->initrd_filename = initrd_filename; 100 env->initrd_filename = initrd_filename;
100 env->board_id = board_id; 101 env->board_id = board_id;
  102 + env->loader_start = loader_start;
101 qemu_register_reset(main_cpu_reset, env); 103 qemu_register_reset(main_cpu_reset, env);
102 } 104 }
103 /* Assume that raw images are linux kernels, and ELF images are not. */ 105 /* 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, @@ -109,7 +111,7 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
109 if (kernel_size < 0) { 111 if (kernel_size < 0) {
110 kernel_size = load_image(kernel_filename, 112 kernel_size = load_image(kernel_filename,
111 phys_ram_base + KERNEL_LOAD_ADDR); 113 phys_ram_base + KERNEL_LOAD_ADDR);
112 - entry = KERNEL_LOAD_ADDR; 114 + entry = loader_start + KERNEL_LOAD_ADDR;
113 is_linux = 1; 115 is_linux = 1;
114 } 116 }
115 if (kernel_size < 0) { 117 if (kernel_size < 0) {
@@ -134,11 +136,10 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename, @@ -134,11 +136,10 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
134 } 136 }
135 bootloader[1] |= board_id & 0xff; 137 bootloader[1] |= board_id & 0xff;
136 bootloader[2] |= (board_id >> 8) & 0xff; 138 bootloader[2] |= (board_id >> 8) & 0xff;
137 - bootloader[5] = KERNEL_ARGS_ADDR; 139 + bootloader[5] = loader_start + KERNEL_ARGS_ADDR;
138 bootloader[6] = entry; 140 bootloader[6] = entry;
139 for (n = 0; n < sizeof(bootloader) / 4; n++) 141 for (n = 0; n < sizeof(bootloader) / 4; n++)
140 stl_raw(phys_ram_base + (n * 4), bootloader[n]); 142 stl_raw(phys_ram_base + (n * 4), bootloader[n]);
141 - set_kernel_args(ram_size, initrd_size, kernel_cmdline); 143 + set_kernel_args(ram_size, initrd_size, kernel_cmdline, loader_start);
142 } 144 }
143 } 145 }
144 -  
hw/integratorcp.c
@@ -508,7 +508,7 @@ static void integratorcp_init(int ram_size, int vga_ram_size, int boot_device, @@ -508,7 +508,7 @@ static void integratorcp_init(int ram_size, int vga_ram_size, int boot_device,
508 pl110_init(ds, 0xc0000000, pic[22], 0); 508 pl110_init(ds, 0xc0000000, pic[22], 0);
509 509
510 arm_load_kernel(env, ram_size, kernel_filename, kernel_cmdline, 510 arm_load_kernel(env, ram_size, kernel_filename, kernel_cmdline,
511 - initrd_filename, 0x113); 511 + initrd_filename, 0x113, 0x0);
512 } 512 }
513 513
514 QEMUMachine integratorcp_machine = { 514 QEMUMachine integratorcp_machine = {
hw/realview.c
@@ -131,7 +131,7 @@ static void realview_init(int ram_size, int vga_ram_size, int boot_device, @@ -131,7 +131,7 @@ static void realview_init(int ram_size, int vga_ram_size, int boot_device,
131 /* 0x6c000000 PCI mem 2. */ 131 /* 0x6c000000 PCI mem 2. */
132 132
133 arm_load_kernel(env, ram_size, kernel_filename, kernel_cmdline, 133 arm_load_kernel(env, ram_size, kernel_filename, kernel_cmdline,
134 - initrd_filename, 0x33b); 134 + initrd_filename, 0x33b, 0x0);
135 } 135 }
136 136
137 QEMUMachine realview_machine = { 137 QEMUMachine realview_machine = {
hw/spitz.c
@@ -1035,7 +1035,7 @@ static void spitz_common_init(int ram_size, int vga_ram_size, @@ -1035,7 +1035,7 @@ static void spitz_common_init(int ram_size, int vga_ram_size,
1035 cpu->env->regs[15] = PXA2XX_RAM_BASE; 1035 cpu->env->regs[15] = PXA2XX_RAM_BASE;
1036 1036
1037 arm_load_kernel(cpu->env, ram_size, kernel_filename, kernel_cmdline, 1037 arm_load_kernel(cpu->env, ram_size, kernel_filename, kernel_cmdline,
1038 - initrd_filename, arm_id); 1038 + initrd_filename, arm_id, PXA2XX_RAM_BASE);
1039 sl_bootparam_write(SL_PXA_PARAM_BASE - PXA2XX_RAM_BASE); 1039 sl_bootparam_write(SL_PXA_PARAM_BASE - PXA2XX_RAM_BASE);
1040 } 1040 }
1041 1041
hw/versatilepb.c
@@ -260,7 +260,7 @@ static void versatile_init(int ram_size, int vga_ram_size, int boot_device, @@ -260,7 +260,7 @@ static void versatile_init(int ram_size, int vga_ram_size, int boot_device,
260 /* 0x101f4000 SSPI. */ 260 /* 0x101f4000 SSPI. */
261 261
262 arm_load_kernel(env, ram_size, kernel_filename, kernel_cmdline, 262 arm_load_kernel(env, ram_size, kernel_filename, kernel_cmdline,
263 - initrd_filename, board_id); 263 + initrd_filename, board_id, 0x0);
264 } 264 }
265 265
266 static void vpb_init(int ram_size, int vga_ram_size, int boot_device, 266 static void vpb_init(int ram_size, int vga_ram_size, int boot_device,
target-arm/cpu.h
@@ -144,12 +144,13 @@ typedef struct CPUARMState { @@ -144,12 +144,13 @@ typedef struct CPUARMState {
144 144
145 CPU_COMMON 145 CPU_COMMON
146 146
147 - /* These fields after the common ones so thes are preserved on reset. */ 147 + /* These fields after the common ones so they are preserved on reset. */
148 int ram_size; 148 int ram_size;
149 const char *kernel_filename; 149 const char *kernel_filename;
150 const char *kernel_cmdline; 150 const char *kernel_cmdline;
151 const char *initrd_filename; 151 const char *initrd_filename;
152 int board_id; 152 int board_id;
  153 + target_phys_addr_t loader_start;
153 } CPUARMState; 154 } CPUARMState;
154 155
155 CPUARMState *cpu_arm_init(void); 156 CPUARMState *cpu_arm_init(void);
@@ -1450,7 +1450,7 @@ qemu_irq *arm_gic_init(uint32_t base, qemu_irq parent_irq); @@ -1450,7 +1450,7 @@ qemu_irq *arm_gic_init(uint32_t base, qemu_irq parent_irq);
1450 1450
1451 void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename, 1451 void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
1452 const char *kernel_cmdline, const char *initrd_filename, 1452 const char *kernel_cmdline, const char *initrd_filename,
1453 - int board_id); 1453 + int board_id, target_phys_addr_t loader_start);
1454 1454
1455 /* sh7750.c */ 1455 /* sh7750.c */
1456 struct SH7750State; 1456 struct SH7750State;