Revision 3b760e04
b/hw/arm_boot.c | ||
---|---|---|
192 | 192 |
int is_linux = 0; |
193 | 193 |
uint64_t elf_entry; |
194 | 194 |
target_ulong entry; |
195 |
uint32_t pd; |
|
196 |
void *loader_phys; |
|
197 | 195 |
|
198 | 196 |
/* Load the kernel. */ |
199 | 197 |
if (!info->kernel_filename) { |
... | ... | |
208 | 206 |
qemu_register_reset(main_cpu_reset, env); |
209 | 207 |
} |
210 | 208 |
|
211 |
/* FIXME: We should make load_image take a guest physical address. */ |
|
212 |
pd = cpu_get_physical_page_desc(info->loader_start); |
|
213 |
loader_phys = phys_ram_base + (pd & TARGET_PAGE_MASK) + |
|
214 |
(info->loader_start & ~TARGET_PAGE_MASK); |
|
215 |
|
|
216 | 209 |
/* Assume that raw images are linux kernels, and ELF images are not. */ |
217 | 210 |
kernel_size = load_elf(info->kernel_filename, 0, &elf_entry, NULL, NULL); |
218 | 211 |
entry = elf_entry; |
... | ... | |
221 | 214 |
&is_linux); |
222 | 215 |
} |
223 | 216 |
if (kernel_size < 0) { |
224 |
kernel_size = load_image(info->kernel_filename, |
|
225 |
loader_phys + KERNEL_LOAD_ADDR); |
|
226 | 217 |
entry = info->loader_start + KERNEL_LOAD_ADDR; |
218 |
kernel_size = load_image_targphys(info->kernel_filename, entry, |
|
219 |
ram_size - KERNEL_LOAD_ADDR); |
|
227 | 220 |
is_linux = 1; |
228 | 221 |
} |
229 | 222 |
if (kernel_size < 0) { |
... | ... | |
237 | 230 |
env->thumb = entry & 1; |
238 | 231 |
} else { |
239 | 232 |
if (info->initrd_filename) { |
240 |
initrd_size = load_image(info->initrd_filename, |
|
241 |
loader_phys + INITRD_LOAD_ADDR); |
|
233 |
initrd_size = load_image_targphys(info->initrd_filename, |
|
234 |
info->loader_start |
|
235 |
+ INITRD_LOAD_ADDR, |
|
236 |
ram_size - INITRD_LOAD_ADDR); |
|
242 | 237 |
if (initrd_size < 0) { |
243 | 238 |
fprintf(stderr, "qemu: could not load initrd '%s'\n", |
244 | 239 |
info->initrd_filename); |
Also available in: Unified diff