Commit f93eb9ff66868df42f8433d16f2dc48a4af2490f

Authored by balrog
1 parent e22f8f39

Move the excess of arm_load_kernel() parameters into a struct.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4212 c046a42c-6fe2-441c-8c8c-71466251a162
hw/arm-misc.h
@@ -21,10 +21,17 @@ qemu_irq *armv7m_init(int flash_size, int sram_size, @@ -21,10 +21,17 @@ qemu_irq *armv7m_init(int flash_size, int sram_size,
21 const char *kernel_filename, const char *cpu_model); 21 const char *kernel_filename, const char *cpu_model);
22 22
23 /* arm_boot.c */ 23 /* arm_boot.c */
24 -  
25 -void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,  
26 - const char *kernel_cmdline, const char *initrd_filename,  
27 - int board_id, target_phys_addr_t loader_start); 24 +struct arm_boot_info {
  25 + int ram_size;
  26 + const char *kernel_filename;
  27 + const char *kernel_cmdline;
  28 + const char *initrd_filename;
  29 + target_phys_addr_t loader_start;
  30 + int nb_cpus;
  31 + int board_id;
  32 + int (*atag_board)(struct arm_boot_info *info, void *p);
  33 +};
  34 +void arm_load_kernel(CPUState *env, struct arm_boot_info *info);
28 35
29 /* armv7m_nvic.c */ 36 /* armv7m_nvic.c */
30 int system_clock_scale; 37 int system_clock_scale;
hw/arm_boot.c
@@ -47,21 +47,18 @@ static void main_cpu_reset(void *opaque) @@ -47,21 +47,18 @@ static void main_cpu_reset(void *opaque)
47 CPUState *env = opaque; 47 CPUState *env = opaque;
48 48
49 cpu_reset(env); 49 cpu_reset(env);
50 - if (env->kernel_filename)  
51 - arm_load_kernel(env, env->ram_size, env->kernel_filename,  
52 - env->kernel_cmdline, env->initrd_filename,  
53 - env->board_id, env->loader_start); 50 + if (env->boot_info)
  51 + arm_load_kernel(env, env->boot_info);
54 52
55 /* TODO: Reset secondary CPUs. */ 53 /* TODO: Reset secondary CPUs. */
56 } 54 }
57 55
58 -static void set_kernel_args(uint32_t ram_size, int initrd_size,  
59 - const char *kernel_cmdline,  
60 - target_phys_addr_t loader_start) 56 +static void set_kernel_args(struct arm_boot_info *info,
  57 + int initrd_size, void *base)
61 { 58 {
62 uint32_t *p; 59 uint32_t *p;
63 60
64 - p = (uint32_t *)(phys_ram_base + KERNEL_ARGS_ADDR); 61 + p = (uint32_t *)(base + KERNEL_ARGS_ADDR);
65 /* ATAG_CORE */ 62 /* ATAG_CORE */
66 stl_raw(p++, 5); 63 stl_raw(p++, 5);
67 stl_raw(p++, 0x54410001); 64 stl_raw(p++, 0x54410001);
@@ -69,46 +66,55 @@ static void set_kernel_args(uint32_t ram_size, int initrd_size, @@ -69,46 +66,55 @@ static void set_kernel_args(uint32_t ram_size, int initrd_size,
69 stl_raw(p++, 0x1000); 66 stl_raw(p++, 0x1000);
70 stl_raw(p++, 0); 67 stl_raw(p++, 0);
71 /* ATAG_MEM */ 68 /* ATAG_MEM */
  69 + /* TODO: handle multiple chips on one ATAG list */
72 stl_raw(p++, 4); 70 stl_raw(p++, 4);
73 stl_raw(p++, 0x54410002); 71 stl_raw(p++, 0x54410002);
74 - stl_raw(p++, ram_size);  
75 - stl_raw(p++, loader_start); 72 + stl_raw(p++, info->ram_size);
  73 + stl_raw(p++, info->loader_start);
76 if (initrd_size) { 74 if (initrd_size) {
77 /* ATAG_INITRD2 */ 75 /* ATAG_INITRD2 */
78 stl_raw(p++, 4); 76 stl_raw(p++, 4);
79 stl_raw(p++, 0x54420005); 77 stl_raw(p++, 0x54420005);
80 - stl_raw(p++, loader_start + INITRD_LOAD_ADDR); 78 + stl_raw(p++, info->loader_start + INITRD_LOAD_ADDR);
81 stl_raw(p++, initrd_size); 79 stl_raw(p++, initrd_size);
82 } 80 }
83 - if (kernel_cmdline && *kernel_cmdline) { 81 + if (info->kernel_cmdline && *info->kernel_cmdline) {
84 /* ATAG_CMDLINE */ 82 /* ATAG_CMDLINE */
85 int cmdline_size; 83 int cmdline_size;
86 84
87 - cmdline_size = strlen(kernel_cmdline);  
88 - memcpy (p + 2, kernel_cmdline, cmdline_size + 1); 85 + cmdline_size = strlen(info->kernel_cmdline);
  86 + memcpy(p + 2, info->kernel_cmdline, cmdline_size + 1);
89 cmdline_size = (cmdline_size >> 2) + 1; 87 cmdline_size = (cmdline_size >> 2) + 1;
90 stl_raw(p++, cmdline_size + 2); 88 stl_raw(p++, cmdline_size + 2);
91 stl_raw(p++, 0x54410009); 89 stl_raw(p++, 0x54410009);
92 p += cmdline_size; 90 p += cmdline_size;
93 } 91 }
  92 + if (info->atag_board) {
  93 + /* ATAG_BOARD */
  94 + int atag_board_len;
  95 +
  96 + atag_board_len = (info->atag_board(info, p + 2) + 3) >> 2;
  97 + stl_raw(p++, 2 + atag_board_len);
  98 + stl_raw(p++, 0x414f4d50);
  99 + p += atag_board_len;
  100 + }
94 /* ATAG_END */ 101 /* ATAG_END */
95 stl_raw(p++, 0); 102 stl_raw(p++, 0);
96 stl_raw(p++, 0); 103 stl_raw(p++, 0);
97 } 104 }
98 105
99 -static void set_kernel_args_old(uint32_t ram_size, int initrd_size,  
100 - const char *kernel_cmdline,  
101 - target_phys_addr_t loader_start) 106 +static void set_kernel_args_old(struct arm_boot_info *info,
  107 + int initrd_size, void *base)
102 { 108 {
103 uint32_t *p; 109 uint32_t *p;
104 unsigned char *s; 110 unsigned char *s;
105 111
106 /* see linux/include/asm-arm/setup.h */ 112 /* see linux/include/asm-arm/setup.h */
107 - p = (uint32_t *)(phys_ram_base + KERNEL_ARGS_ADDR); 113 + p = (uint32_t *)(base + KERNEL_ARGS_ADDR);
108 /* page_size */ 114 /* page_size */
109 stl_raw(p++, 4096); 115 stl_raw(p++, 4096);
110 /* nr_pages */ 116 /* nr_pages */
111 - stl_raw(p++, ram_size / 4096); 117 + stl_raw(p++, info->ram_size / 4096);
112 /* ramdisk_size */ 118 /* ramdisk_size */
113 stl_raw(p++, 0); 119 stl_raw(p++, 0);
114 #define FLAG_READONLY 1 120 #define FLAG_READONLY 1
@@ -142,7 +148,7 @@ static void set_kernel_args_old(uint32_t ram_size, int initrd_size, @@ -142,7 +148,7 @@ static void set_kernel_args_old(uint32_t ram_size, int initrd_size,
142 stl_raw(p++, 0); 148 stl_raw(p++, 0);
143 /* initrd_start */ 149 /* initrd_start */
144 if (initrd_size) 150 if (initrd_size)
145 - stl_raw(p++, loader_start + INITRD_LOAD_ADDR); 151 + stl_raw(p++, info->loader_start + INITRD_LOAD_ADDR);
146 else 152 else
147 stl_raw(p++, 0); 153 stl_raw(p++, 0);
148 /* initrd_size */ 154 /* initrd_size */
@@ -159,17 +165,15 @@ static void set_kernel_args_old(uint32_t ram_size, int initrd_size, @@ -159,17 +165,15 @@ static void set_kernel_args_old(uint32_t ram_size, int initrd_size,
159 stl_raw(p++, 0); 165 stl_raw(p++, 0);
160 /* zero unused fields */ 166 /* zero unused fields */
161 memset(p, 0, 256 + 1024 - 167 memset(p, 0, 256 + 1024 -
162 - (p - ((uint32_t *)(phys_ram_base + KERNEL_ARGS_ADDR))));  
163 - s = phys_ram_base + KERNEL_ARGS_ADDR + 256 + 1024;  
164 - if (kernel_cmdline)  
165 - strcpy (s, kernel_cmdline); 168 + (p - ((uint32_t *)(base + KERNEL_ARGS_ADDR))));
  169 + s = base + KERNEL_ARGS_ADDR + 256 + 1024;
  170 + if (info->kernel_cmdline)
  171 + strcpy (s, info->kernel_cmdline);
166 else 172 else
167 stb_raw(s, 0); 173 stb_raw(s, 0);
168 } 174 }
169 175
170 -void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,  
171 - const char *kernel_cmdline, const char *initrd_filename,  
172 - int board_id, target_phys_addr_t loader_start) 176 +void arm_load_kernel(CPUState *env, struct arm_boot_info *info)
173 { 177 {
174 int kernel_size; 178 int kernel_size;
175 int initrd_size; 179 int initrd_size;
@@ -177,36 +181,41 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename, @@ -177,36 +181,41 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
177 int is_linux = 0; 181 int is_linux = 0;
178 uint64_t elf_entry; 182 uint64_t elf_entry;
179 target_ulong entry; 183 target_ulong entry;
  184 + uint32_t pd;
  185 + void *loader_phys;
180 186
181 /* Load the kernel. */ 187 /* Load the kernel. */
182 - if (!kernel_filename) { 188 + if (!info->kernel_filename) {
183 fprintf(stderr, "Kernel image must be specified\n"); 189 fprintf(stderr, "Kernel image must be specified\n");
184 exit(1); 190 exit(1);
185 } 191 }
186 192
187 - if (!env->kernel_filename) {  
188 - env->ram_size = ram_size;  
189 - env->kernel_filename = kernel_filename;  
190 - env->kernel_cmdline = kernel_cmdline;  
191 - env->initrd_filename = initrd_filename;  
192 - env->board_id = board_id;  
193 - env->loader_start = loader_start; 193 + if (!env->boot_info) {
  194 + if (info->nb_cpus == 0)
  195 + info->nb_cpus = 1;
  196 + env->boot_info = info;
194 qemu_register_reset(main_cpu_reset, env); 197 qemu_register_reset(main_cpu_reset, env);
195 } 198 }
  199 +
  200 + pd = cpu_get_physical_page_desc(info->loader_start);
  201 + loader_phys = phys_ram_base + (pd & TARGET_PAGE_MASK) +
  202 + (info->loader_start & ~TARGET_PAGE_MASK);
  203 +
196 /* Assume that raw images are linux kernels, and ELF images are not. */ 204 /* Assume that raw images are linux kernels, and ELF images are not. */
197 - kernel_size = load_elf(kernel_filename, 0, &elf_entry, NULL, NULL); 205 + kernel_size = load_elf(info->kernel_filename, 0, &elf_entry, NULL, NULL);
198 entry = elf_entry; 206 entry = elf_entry;
199 if (kernel_size < 0) { 207 if (kernel_size < 0) {
200 - kernel_size = load_uboot(kernel_filename, &entry, &is_linux); 208 + kernel_size = load_uboot(info->kernel_filename, &entry, &is_linux);
201 } 209 }
202 if (kernel_size < 0) { 210 if (kernel_size < 0) {
203 - kernel_size = load_image(kernel_filename,  
204 - phys_ram_base + KERNEL_LOAD_ADDR);  
205 - entry = loader_start + KERNEL_LOAD_ADDR; 211 + kernel_size = load_image(info->kernel_filename,
  212 + loader_phys + KERNEL_LOAD_ADDR);
  213 + entry = info->loader_start + KERNEL_LOAD_ADDR;
206 is_linux = 1; 214 is_linux = 1;
207 } 215 }
208 if (kernel_size < 0) { 216 if (kernel_size < 0) {
209 - fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename); 217 + fprintf(stderr, "qemu: could not load kernel '%s'\n",
  218 + info->kernel_filename);
210 exit(1); 219 exit(1);
211 } 220 }
212 if (!is_linux) { 221 if (!is_linux) {
@@ -214,30 +223,29 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename, @@ -214,30 +223,29 @@ void arm_load_kernel(CPUState *env, int ram_size, const char *kernel_filename,
214 env->regs[15] = entry & 0xfffffffe; 223 env->regs[15] = entry & 0xfffffffe;
215 env->thumb = entry & 1; 224 env->thumb = entry & 1;
216 } else { 225 } else {
217 - if (initrd_filename) {  
218 - initrd_size = load_image(initrd_filename,  
219 - phys_ram_base + INITRD_LOAD_ADDR); 226 + if (info->initrd_filename) {
  227 + initrd_size = load_image(info->initrd_filename,
  228 + loader_phys + INITRD_LOAD_ADDR);
220 if (initrd_size < 0) { 229 if (initrd_size < 0) {
221 fprintf(stderr, "qemu: could not load initrd '%s'\n", 230 fprintf(stderr, "qemu: could not load initrd '%s'\n",
222 - initrd_filename); 231 + info->initrd_filename);
223 exit(1); 232 exit(1);
224 } 233 }
225 } else { 234 } else {
226 initrd_size = 0; 235 initrd_size = 0;
227 } 236 }
228 - bootloader[1] |= board_id & 0xff;  
229 - bootloader[2] |= (board_id >> 8) & 0xff;  
230 - bootloader[5] = loader_start + KERNEL_ARGS_ADDR; 237 + bootloader[1] |= info->board_id & 0xff;
  238 + bootloader[2] |= (info->board_id >> 8) & 0xff;
  239 + bootloader[5] = info->loader_start + KERNEL_ARGS_ADDR;
231 bootloader[6] = entry; 240 bootloader[6] = entry;
232 for (n = 0; n < sizeof(bootloader) / 4; n++) 241 for (n = 0; n < sizeof(bootloader) / 4; n++)
233 - stl_raw(phys_ram_base + (n * 4), bootloader[n]);  
234 - for (n = 0; n < sizeof(smpboot) / 4; n++)  
235 - stl_raw(phys_ram_base + ram_size + (n * 4), smpboot[n]); 242 + stl_raw(loader_phys + (n * 4), bootloader[n]);
  243 + if (info->nb_cpus > 1)
  244 + for (n = 0; n < sizeof(smpboot) / 4; n++)
  245 + stl_raw(loader_phys + info->ram_size + (n * 4), smpboot[n]);
236 if (old_param) 246 if (old_param)
237 - set_kernel_args_old(ram_size, initrd_size,  
238 - kernel_cmdline, loader_start); 247 + set_kernel_args_old(info, initrd_size, loader_phys);
239 else 248 else
240 - set_kernel_args(ram_size, initrd_size,  
241 - kernel_cmdline, loader_start); 249 + set_kernel_args(info, initrd_size, loader_phys);
242 } 250 }
243 } 251 }
hw/integratorcp.c
@@ -469,6 +469,11 @@ static void icp_control_init(uint32_t base) @@ -469,6 +469,11 @@ static void icp_control_init(uint32_t base)
469 469
470 /* Board init. */ 470 /* Board init. */
471 471
  472 +static struct arm_boot_info integrator_binfo = {
  473 + .loader_start = 0x0,
  474 + .board_id = 0x113,
  475 +};
  476 +
472 static void integratorcp_init(int ram_size, int vga_ram_size, 477 static void integratorcp_init(int ram_size, int vga_ram_size,
473 const char *boot_device, DisplayState *ds, 478 const char *boot_device, DisplayState *ds,
474 const char *kernel_filename, const char *kernel_cmdline, 479 const char *kernel_filename, const char *kernel_cmdline,
@@ -527,8 +532,11 @@ static void integratorcp_init(int ram_size, int vga_ram_size, @@ -527,8 +532,11 @@ static void integratorcp_init(int ram_size, int vga_ram_size,
527 } 532 }
528 pl110_init(ds, 0xc0000000, pic[22], 0); 533 pl110_init(ds, 0xc0000000, pic[22], 0);
529 534
530 - arm_load_kernel(env, ram_size, kernel_filename, kernel_cmdline,  
531 - initrd_filename, 0x113, 0x0); 535 + integrator_binfo.ram_size = ram_size;
  536 + integrator_binfo.kernel_filename = kernel_filename;
  537 + integrator_binfo.kernel_cmdline = kernel_cmdline;
  538 + integrator_binfo.initrd_filename = initrd_filename;
  539 + arm_load_kernel(env, &integrator_binfo);
532 } 540 }
533 541
534 QEMUMachine integratorcp_machine = { 542 QEMUMachine integratorcp_machine = {
hw/mainstone.c
@@ -59,12 +59,17 @@ static struct keymap map[0xE0] = { @@ -59,12 +59,17 @@ static struct keymap map[0xE0] = {
59 59
60 enum mainstone_model_e { mainstone }; 60 enum mainstone_model_e { mainstone };
61 61
  62 +static struct arm_boot_info mainstone_binfo = {
  63 + .loader_start = PXA2XX_SDRAM_BASE,
  64 + .ram_size = 0x04000000,
  65 +};
  66 +
62 static void mainstone_common_init(int ram_size, int vga_ram_size, 67 static void mainstone_common_init(int ram_size, int vga_ram_size,
63 DisplayState *ds, const char *kernel_filename, 68 DisplayState *ds, const char *kernel_filename,
64 const char *kernel_cmdline, const char *initrd_filename, 69 const char *kernel_cmdline, const char *initrd_filename,
65 const char *cpu_model, enum mainstone_model_e model, int arm_id) 70 const char *cpu_model, enum mainstone_model_e model, int arm_id)
66 { 71 {
67 - uint32_t mainstone_ram = 0x04000000; 72 + uint32_t mainstone_ram = mainstone_binfo.ram_size;
68 uint32_t mainstone_rom = 0x00800000; 73 uint32_t mainstone_rom = 0x00800000;
69 uint32_t mainstone_flash = 0x02000000; 74 uint32_t mainstone_flash = 0x02000000;
70 uint32_t sector_len = 256 * 1024; 75 uint32_t sector_len = 256 * 1024;
@@ -90,7 +95,7 @@ static void mainstone_common_init(int ram_size, int vga_ram_size, @@ -90,7 +95,7 @@ static void mainstone_common_init(int ram_size, int vga_ram_size,
90 qemu_ram_alloc(mainstone_rom) | IO_MEM_ROM); 95 qemu_ram_alloc(mainstone_rom) | IO_MEM_ROM);
91 96
92 /* Setup initial (reset) machine state */ 97 /* Setup initial (reset) machine state */
93 - cpu->env->regs[15] = PXA2XX_SDRAM_BASE; 98 + cpu->env->regs[15] = mainstone_binfo.loader_start;
94 99
95 /* There are two 32MiB flash devices on the board */ 100 /* There are two 32MiB flash devices on the board */
96 for (i = 0; i < 2; i ++) { 101 for (i = 0; i < 2; i ++) {
@@ -121,8 +126,11 @@ static void mainstone_common_init(int ram_size, int vga_ram_size, @@ -121,8 +126,11 @@ static void mainstone_common_init(int ram_size, int vga_ram_size,
121 126
122 smc91c111_init(&nd_table[0], MST_ETH_PHYS, mst_irq[ETHERNET_IRQ]); 127 smc91c111_init(&nd_table[0], MST_ETH_PHYS, mst_irq[ETHERNET_IRQ]);
123 128
124 - arm_load_kernel(cpu->env, mainstone_ram, kernel_filename, kernel_cmdline,  
125 - initrd_filename, arm_id, PXA2XX_SDRAM_BASE); 129 + mainstone_binfo.kernel_filename = kernel_filename;
  130 + mainstone_binfo.kernel_cmdline = kernel_cmdline;
  131 + mainstone_binfo.initrd_filename = initrd_filename;
  132 + mainstone_binfo.board_id = arm_id;
  133 + arm_load_kernel(cpu->env, &mainstone_binfo);
126 } 134 }
127 135
128 static void mainstone_init(int ram_size, int vga_ram_size, 136 static void mainstone_init(int ram_size, int vga_ram_size,
hw/palm.c
@@ -183,6 +183,12 @@ static void palmte_gpio_setup(struct omap_mpu_state_s *cpu) @@ -183,6 +183,12 @@ static void palmte_gpio_setup(struct omap_mpu_state_s *cpu)
183 qemu_irq_raise(omap_mpuio_in_get(cpu->mpuio)[11]); 183 qemu_irq_raise(omap_mpuio_in_get(cpu->mpuio)[11]);
184 } 184 }
185 185
  186 +static struct arm_boot_info palmte_binfo = {
  187 + .loader_start = OMAP_EMIFF_BASE,
  188 + .ram_size = 0x02000000,
  189 + .board_id = 0x331,
  190 +};
  191 +
186 static void palmte_init(int ram_size, int vga_ram_size, 192 static void palmte_init(int ram_size, int vga_ram_size,
187 const char *boot_device, DisplayState *ds, 193 const char *boot_device, DisplayState *ds,
188 const char *kernel_filename, const char *kernel_cmdline, 194 const char *kernel_filename, const char *kernel_cmdline,
@@ -190,7 +196,7 @@ static void palmte_init(int ram_size, int vga_ram_size, @@ -190,7 +196,7 @@ static void palmte_init(int ram_size, int vga_ram_size,
190 { 196 {
191 struct omap_mpu_state_s *cpu; 197 struct omap_mpu_state_s *cpu;
192 int flash_size = 0x00800000; 198 int flash_size = 0x00800000;
193 - int sdram_size = 0x02000000; 199 + int sdram_size = palmte_binfo.ram_size;
194 int io; 200 int io;
195 static uint32_t cs0val = 0xffffffff; 201 static uint32_t cs0val = 0xffffffff;
196 static uint32_t cs1val = 0x0000e1a0; 202 static uint32_t cs1val = 0x0000e1a0;
@@ -250,10 +256,12 @@ static void palmte_init(int ram_size, int vga_ram_size, @@ -250,10 +256,12 @@ static void palmte_init(int ram_size, int vga_ram_size,
250 /* Load the kernel. */ 256 /* Load the kernel. */
251 if (kernel_filename) { 257 if (kernel_filename) {
252 /* Start at bootloader. */ 258 /* Start at bootloader. */
253 - cpu->env->regs[15] = OMAP_EMIFF_BASE; 259 + cpu->env->regs[15] = palmte_binfo.loader_start;
254 260
255 - arm_load_kernel(cpu->env, sdram_size, kernel_filename, kernel_cmdline,  
256 - initrd_filename, 0x331, OMAP_EMIFF_BASE); 261 + palmte_binfo.kernel_filename = kernel_filename;
  262 + palmte_binfo.kernel_cmdline = kernel_cmdline;
  263 + palmte_binfo.initrd_filename = initrd_filename;
  264 + arm_load_kernel(cpu->env, &palmte_binfo);
257 } 265 }
258 266
259 dpy_resize(ds, 320, 320); 267 dpy_resize(ds, 320, 320);
hw/realview.c
@@ -18,6 +18,11 @@ @@ -18,6 +18,11 @@
18 18
19 /* Board init. */ 19 /* Board init. */
20 20
  21 +static struct arm_boot_info realview_binfo = {
  22 + .loader_start = 0x0,
  23 + .board_id = 0x33b,
  24 +};
  25 +
21 static void realview_init(int ram_size, int vga_ram_size, 26 static void realview_init(int ram_size, int vga_ram_size,
22 const char *boot_device, DisplayState *ds, 27 const char *boot_device, DisplayState *ds,
23 const char *kernel_filename, const char *kernel_cmdline, 28 const char *kernel_filename, const char *kernel_cmdline,
@@ -177,8 +182,12 @@ static void realview_init(int ram_size, int vga_ram_size, @@ -177,8 +182,12 @@ static void realview_init(int ram_size, int vga_ram_size,
177 /* 0x68000000 PCI mem 1. */ 182 /* 0x68000000 PCI mem 1. */
178 /* 0x6c000000 PCI mem 2. */ 183 /* 0x6c000000 PCI mem 2. */
179 184
180 - arm_load_kernel(first_cpu, ram_size, kernel_filename, kernel_cmdline,  
181 - initrd_filename, 0x33b, 0x0); 185 + realview_binfo.ram_size = ram_size;
  186 + realview_binfo.kernel_filename = kernel_filename;
  187 + realview_binfo.kernel_cmdline = kernel_cmdline;
  188 + realview_binfo.initrd_filename = initrd_filename;
  189 + realview_binfo.nb_cpus = ncpu;
  190 + arm_load_kernel(first_cpu, &realview_binfo);
182 191
183 /* ??? Hack to map an additional page of ram for the secondary CPU 192 /* ??? Hack to map an additional page of ram for the secondary CPU
184 startup code. I guess this works on real hardware because the 193 startup code. I guess this works on real hardware because the
hw/spitz.c
@@ -1180,12 +1180,17 @@ static void sl_bootparam_write(uint32_t ptr) @@ -1180,12 +1180,17 @@ static void sl_bootparam_write(uint32_t ptr)
1180 /* Board init. */ 1180 /* Board init. */
1181 enum spitz_model_e { spitz, akita, borzoi, terrier }; 1181 enum spitz_model_e { spitz, akita, borzoi, terrier };
1182 1182
  1183 +static struct arm_boot_info spitz_binfo = {
  1184 + .loader_start = PXA2XX_SDRAM_BASE,
  1185 + .ram_size = 0x04000000,
  1186 +};
  1187 +
1183 static void spitz_common_init(int ram_size, int vga_ram_size, 1188 static void spitz_common_init(int ram_size, int vga_ram_size,
1184 DisplayState *ds, const char *kernel_filename, 1189 DisplayState *ds, const char *kernel_filename,
1185 const char *kernel_cmdline, const char *initrd_filename, 1190 const char *kernel_cmdline, const char *initrd_filename,
1186 const char *cpu_model, enum spitz_model_e model, int arm_id) 1191 const char *cpu_model, enum spitz_model_e model, int arm_id)
1187 { 1192 {
1188 - uint32_t spitz_ram = 0x04000000; 1193 + uint32_t spitz_ram = spitz_binfo.ram_size;
1189 uint32_t spitz_rom = 0x00800000; 1194 uint32_t spitz_rom = 0x00800000;
1190 struct pxa2xx_state_s *cpu; 1195 struct pxa2xx_state_s *cpu;
1191 struct scoop_info_s *scp; 1196 struct scoop_info_s *scp;
@@ -1230,10 +1235,13 @@ static void spitz_common_init(int ram_size, int vga_ram_size, @@ -1230,10 +1235,13 @@ static void spitz_common_init(int ram_size, int vga_ram_size,
1230 spitz_microdrive_attach(cpu); 1235 spitz_microdrive_attach(cpu);
1231 1236
1232 /* Setup initial (reset) machine state */ 1237 /* Setup initial (reset) machine state */
1233 - cpu->env->regs[15] = PXA2XX_SDRAM_BASE; 1238 + cpu->env->regs[15] = spitz_binfo.loader_start;
1234 1239
1235 - arm_load_kernel(cpu->env, spitz_ram, kernel_filename, kernel_cmdline,  
1236 - initrd_filename, arm_id, PXA2XX_SDRAM_BASE); 1240 + spitz_binfo.kernel_filename = kernel_filename;
  1241 + spitz_binfo.kernel_cmdline = kernel_cmdline;
  1242 + spitz_binfo.initrd_filename = initrd_filename;
  1243 + spitz_binfo.board_id = arm_id;
  1244 + arm_load_kernel(cpu->env, &spitz_binfo);
1237 sl_bootparam_write(SL_PXA_PARAM_BASE - PXA2XX_SDRAM_BASE); 1245 sl_bootparam_write(SL_PXA_PARAM_BASE - PXA2XX_SDRAM_BASE);
1238 } 1246 }
1239 1247
hw/versatilepb.c
@@ -157,6 +157,8 @@ static qemu_irq *vpb_sic_init(uint32_t base, qemu_irq *parent, int irq) @@ -157,6 +157,8 @@ static qemu_irq *vpb_sic_init(uint32_t base, qemu_irq *parent, int irq)
157 peripherans and expansion busses. For now we emulate a subset of the 157 peripherans and expansion busses. For now we emulate a subset of the
158 PB peripherals and just change the board ID. */ 158 PB peripherals and just change the board ID. */
159 159
  160 +static struct arm_boot_info versatile_binfo;
  161 +
160 static void versatile_init(int ram_size, int vga_ram_size, 162 static void versatile_init(int ram_size, int vga_ram_size,
161 const char *boot_device, DisplayState *ds, 163 const char *boot_device, DisplayState *ds,
162 const char *kernel_filename, const char *kernel_cmdline, 164 const char *kernel_filename, const char *kernel_cmdline,
@@ -283,8 +285,12 @@ static void versatile_init(int ram_size, int vga_ram_size, @@ -283,8 +285,12 @@ static void versatile_init(int ram_size, int vga_ram_size,
283 /* 0x101f3000 UART2. */ 285 /* 0x101f3000 UART2. */
284 /* 0x101f4000 SSPI. */ 286 /* 0x101f4000 SSPI. */
285 287
286 - arm_load_kernel(env, ram_size, kernel_filename, kernel_cmdline,  
287 - initrd_filename, board_id, 0x0); 288 + versatile_binfo.ram_size = ram_size;
  289 + versatile_binfo.kernel_filename = kernel_filename;
  290 + versatile_binfo.kernel_cmdline = kernel_cmdline;
  291 + versatile_binfo.initrd_filename = initrd_filename;
  292 + versatile_binfo.board_id = board_id;
  293 + arm_load_kernel(env, &versatile_binfo);
288 } 294 }
289 295
290 static void vpb_init(int ram_size, int vga_ram_size, 296 static void vpb_init(int ram_size, int vga_ram_size,
target-arm/cpu.h
@@ -55,6 +55,8 @@ typedef void ARMWriteCPFunc(void *opaque, int cp_info, @@ -55,6 +55,8 @@ typedef void ARMWriteCPFunc(void *opaque, int cp_info,
55 typedef uint32_t ARMReadCPFunc(void *opaque, int cp_info, 55 typedef uint32_t ARMReadCPFunc(void *opaque, int cp_info,
56 int dstreg, int operand); 56 int dstreg, int operand);
57 57
  58 +struct arm_boot_info;
  59 +
58 #define NB_MMU_MODES 2 60 #define NB_MMU_MODES 2
59 61
60 /* We currently assume float and double are IEEE single and double 62 /* We currently assume float and double are IEEE single and double
@@ -196,12 +198,7 @@ typedef struct CPUARMState { @@ -196,12 +198,7 @@ typedef struct CPUARMState {
196 CPU_COMMON 198 CPU_COMMON
197 199
198 /* These fields after the common ones so they are preserved on reset. */ 200 /* These fields after the common ones so they are preserved on reset. */
199 - int ram_size;  
200 - const char *kernel_filename;  
201 - const char *kernel_cmdline;  
202 - const char *initrd_filename;  
203 - int board_id;  
204 - target_phys_addr_t loader_start; 201 + struct arm_boot_info *boot_info;
205 } CPUARMState; 202 } CPUARMState;
206 203
207 CPUARMState *cpu_arm_init(const char *cpu_model); 204 CPUARMState *cpu_arm_init(const char *cpu_model);