Revision 1c7b3754 hw/arm_boot.c
b/hw/arm_boot.c | ||
---|---|---|
71 | 71 |
int kernel_size; |
72 | 72 |
int initrd_size; |
73 | 73 |
int n; |
74 |
uint64_t entry; |
|
74 |
int is_linux = 0; |
|
75 |
uint64_t elf_entry; |
|
76 |
target_ulong entry; |
|
75 | 77 |
|
76 | 78 |
/* Load the kernel. */ |
77 | 79 |
if (!kernel_filename) { |
... | ... | |
79 | 81 |
exit(1); |
80 | 82 |
} |
81 | 83 |
|
82 |
kernel_size = load_elf(kernel_filename, 0, &entry); |
|
83 |
if (kernel_size >= 0) { |
|
84 |
/* An ELF image. Jump to the entry point. */ |
|
84 |
/* Assume that raw images are linux kernels, and ELF images are not. */ |
|
85 |
kernel_size = load_elf(kernel_filename, 0, &elf_entry); |
|
86 |
entry = elf_entry; |
|
87 |
if (kernel_size < 0) { |
|
88 |
kernel_size = load_uboot(kernel_filename, &entry, &is_linux); |
|
89 |
} |
|
90 |
if (kernel_size < 0) { |
|
91 |
kernel_size = load_image(kernel_filename, |
|
92 |
phys_ram_base + KERNEL_LOAD_ADDR); |
|
93 |
entry = KERNEL_LOAD_ADDR; |
|
94 |
is_linux = 1; |
|
95 |
} |
|
96 |
if (kernel_size < 0) { |
|
97 |
fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename); |
|
98 |
exit(1); |
|
99 |
} |
|
100 |
if (!is_linux) { |
|
101 |
/* Jump to the entry point. */ |
|
85 | 102 |
env->regs[15] = entry & 0xfffffffe; |
86 | 103 |
env->thumb = entry & 1; |
87 | 104 |
} else { |
88 |
/* Raw binary image. Assume it is a Linux zImage. */ |
|
89 |
kernel_size = load_image(kernel_filename, |
|
90 |
phys_ram_base + KERNEL_LOAD_ADDR); |
|
91 |
if (kernel_size < 0) { |
|
92 |
fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename); |
|
93 |
exit(1); |
|
94 |
} |
|
95 | 105 |
if (initrd_filename) { |
96 | 106 |
initrd_size = load_image(initrd_filename, |
97 | 107 |
phys_ram_base + INITRD_LOAD_ADDR); |
... | ... | |
106 | 116 |
bootloader[1] |= board_id & 0xff; |
107 | 117 |
bootloader[2] |= (board_id >> 8) & 0xff; |
108 | 118 |
bootloader[5] = KERNEL_ARGS_ADDR; |
109 |
bootloader[6] = KERNEL_LOAD_ADDR;
|
|
119 |
bootloader[6] = entry;
|
|
110 | 120 |
for (n = 0; n < sizeof(bootloader) / 4; n++) |
111 | 121 |
stl_raw(phys_ram_base + (n * 4), bootloader[n]); |
112 | 122 |
set_kernel_args(ram_size, initrd_size, kernel_cmdline); |
Also available in: Unified diff