Revision 409dbce5
b/Makefile.target | ||
---|---|---|
237 | 237 |
obj-ppc-$(CONFIG_FDT) += device_tree.o |
238 | 238 |
|
239 | 239 |
obj-mips-y = mips_r4k.o mips_jazz.o mips_malta.o mips_mipssim.o |
240 |
obj-mips-y += mips_timer.o mips_int.o dma.o vga.o serial.o i8254.o i8259.o rc4030.o |
|
240 |
obj-mips-y += mips_addr.o mips_timer.o mips_int.o |
|
241 |
obj-mips-y += dma.o vga.o serial.o i8254.o i8259.o rc4030.o |
|
241 | 242 |
obj-mips-y += vga-pci.o vga-isa.o vga-isa-mm.o |
242 | 243 |
obj-mips-y += g364fb.o jazz_led.o dp8393x.o |
243 | 244 |
obj-mips-y += ide/core.o ide/qdev.o ide/isa.o ide/pci.o ide/piix.o |
b/hw/an5206.c | ||
---|---|---|
68 | 68 |
exit(1); |
69 | 69 |
} |
70 | 70 |
|
71 |
kernel_size = load_elf(kernel_filename, 0, &elf_entry, NULL, NULL,
|
|
72 |
1, ELF_MACHINE, 0); |
|
71 |
kernel_size = load_elf(kernel_filename, NULL, NULL, &elf_entry,
|
|
72 |
NULL, NULL, 1, ELF_MACHINE, 0);
|
|
73 | 73 |
entry = elf_entry; |
74 | 74 |
if (kernel_size < 0) { |
75 | 75 |
kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL); |
b/hw/arm_boot.c | ||
---|---|---|
225 | 225 |
#endif |
226 | 226 |
|
227 | 227 |
/* Assume that raw images are linux kernels, and ELF images are not. */ |
228 |
kernel_size = load_elf(info->kernel_filename, 0, &elf_entry, NULL, NULL,
|
|
229 |
big_endian, ELF_MACHINE, 1); |
|
228 |
kernel_size = load_elf(info->kernel_filename, NULL, NULL, &elf_entry,
|
|
229 |
NULL, NULL, big_endian, ELF_MACHINE, 1);
|
|
230 | 230 |
entry = elf_entry; |
231 | 231 |
if (kernel_size < 0) { |
232 | 232 |
kernel_size = load_uimage(info->kernel_filename, &entry, NULL, |
b/hw/armv7m.c | ||
---|---|---|
215 | 215 |
big_endian = 0; |
216 | 216 |
#endif |
217 | 217 |
|
218 |
image_size = load_elf(kernel_filename, 0, &entry, &lowaddr, NULL,
|
|
219 |
big_endian, ELF_MACHINE, 1); |
|
218 |
image_size = load_elf(kernel_filename, NULL, NULL, &entry, &lowaddr,
|
|
219 |
NULL, big_endian, ELF_MACHINE, 1);
|
|
220 | 220 |
if (image_size < 0) { |
221 | 221 |
image_size = load_image_targphys(kernel_filename, 0, flash_size); |
222 | 222 |
lowaddr = 0; |
b/hw/axis_dev88.c | ||
---|---|---|
249 | 249 |
env->pc = bootstrap_pc; |
250 | 250 |
} |
251 | 251 |
|
252 |
static uint64_t translate_kernel_address(void *opaque, uint64_t addr) |
|
253 |
{ |
|
254 |
return addr - 0x80000000LL; |
|
255 |
} |
|
256 |
|
|
252 | 257 |
static |
253 | 258 |
void axisdev88_init (ram_addr_t ram_size, |
254 | 259 |
const char *boot_device, |
... | ... | |
345 | 350 |
|
346 | 351 |
/* Boots a kernel elf binary, os/linux-2.6/vmlinux from the axis |
347 | 352 |
devboard SDK. */ |
348 |
kernel_size = load_elf(kernel_filename, -0x80000000LL,
|
|
353 |
kernel_size = load_elf(kernel_filename, translate_kernel_address, NULL,
|
|
349 | 354 |
&entry, NULL, &high, 0, ELF_MACHINE, 0); |
350 | 355 |
bootstrap_pc = entry; |
351 | 356 |
if (kernel_size < 0) { |
b/hw/dummy_m68k.c | ||
---|---|---|
43 | 43 |
|
44 | 44 |
/* Load kernel. */ |
45 | 45 |
if (kernel_filename) { |
46 |
kernel_size = load_elf(kernel_filename, 0, &elf_entry, NULL, NULL,
|
|
47 |
1, ELF_MACHINE, 0); |
|
46 |
kernel_size = load_elf(kernel_filename, NULL, NULL, &elf_entry,
|
|
47 |
NULL, NULL, 1, ELF_MACHINE, 0);
|
|
48 | 48 |
entry = elf_entry; |
49 | 49 |
if (kernel_size < 0) { |
50 | 50 |
kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL); |
b/hw/elf_ops.h | ||
---|---|---|
184 | 184 |
return -1; |
185 | 185 |
} |
186 | 186 |
|
187 |
static int glue(load_elf, SZ)(const char *name, int fd, int64_t address_offset, |
|
187 |
static int glue(load_elf, SZ)(const char *name, int fd, |
|
188 |
uint64_t (*translate_fn)(void *, uint64_t), |
|
189 |
void *translate_opaque, |
|
188 | 190 |
int must_swab, uint64_t *pentry, |
189 | 191 |
uint64_t *lowaddr, uint64_t *highaddr, |
190 | 192 |
int elf_machine, int clear_lsb) |
... | ... | |
253 | 255 |
} |
254 | 256 |
/* address_offset is hack for kernel images that are |
255 | 257 |
linked at the wrong physical address. */ |
256 |
addr = ph->p_paddr + address_offset; |
|
258 |
if (translate_fn) { |
|
259 |
addr = translate_fn(translate_opaque, ph->p_paddr); |
|
260 |
} else { |
|
261 |
addr = ph->p_paddr; |
|
262 |
} |
|
257 | 263 |
|
258 | 264 |
snprintf(label, sizeof(label), "phdr #%d: %s", i, name); |
259 | 265 |
rom_add_blob_fixed(label, data, mem_size, addr); |
b/hw/etraxfs.c | ||
---|---|---|
44 | 44 |
env->pc = bootstrap_pc; |
45 | 45 |
} |
46 | 46 |
|
47 |
static uint64_t translate_kernel_address(void *opaque, uint64_t addr) |
|
48 |
{ |
|
49 |
return addr - 0x80000000LL; |
|
50 |
} |
|
51 |
|
|
47 | 52 |
static |
48 | 53 |
void bareetraxfs_init (ram_addr_t ram_size, |
49 | 54 |
const char *boot_device, |
... | ... | |
137 | 142 |
|
138 | 143 |
/* Boots a kernel elf binary, os/linux-2.6/vmlinux from the axis |
139 | 144 |
devboard SDK. */ |
140 |
kernel_size = load_elf(kernel_filename, -0x80000000LL,
|
|
145 |
kernel_size = load_elf(kernel_filename, translate_kernel_address, NULL,
|
|
141 | 146 |
&entry, NULL, &high, 0, ELF_MACHINE, 0); |
142 | 147 |
bootstrap_pc = entry; |
143 | 148 |
if (kernel_size < 0) { |
b/hw/loader.c | ||
---|---|---|
276 | 276 |
#include "elf_ops.h" |
277 | 277 |
|
278 | 278 |
/* return < 0 if error, otherwise the number of bytes loaded in memory */ |
279 |
int load_elf(const char *filename, int64_t address_offset,
|
|
280 |
uint64_t *pentry, uint64_t *lowaddr, uint64_t *highaddr,
|
|
281 |
int big_endian, int elf_machine, int clear_lsb) |
|
279 |
int load_elf(const char *filename, uint64_t (*translate_fn)(void *, uint64_t),
|
|
280 |
void *translate_opaque, uint64_t *pentry, uint64_t *lowaddr,
|
|
281 |
uint64_t *highaddr, int big_endian, int elf_machine, int clear_lsb)
|
|
282 | 282 |
{ |
283 | 283 |
int fd, data_order, target_data_order, must_swab, ret; |
284 | 284 |
uint8_t e_ident[EI_NIDENT]; |
... | ... | |
312 | 312 |
|
313 | 313 |
lseek(fd, 0, SEEK_SET); |
314 | 314 |
if (e_ident[EI_CLASS] == ELFCLASS64) { |
315 |
ret = load_elf64(filename, fd, address_offset, must_swab, pentry,
|
|
316 |
lowaddr, highaddr, elf_machine, clear_lsb); |
|
315 |
ret = load_elf64(filename, fd, translate_fn, translate_opaque, must_swab,
|
|
316 |
pentry, lowaddr, highaddr, elf_machine, clear_lsb);
|
|
317 | 317 |
} else { |
318 |
ret = load_elf32(filename, fd, address_offset, must_swab, pentry,
|
|
319 |
lowaddr, highaddr, elf_machine, clear_lsb); |
|
318 |
ret = load_elf32(filename, fd, translate_fn, translate_opaque, must_swab,
|
|
319 |
pentry, lowaddr, highaddr, elf_machine, clear_lsb);
|
|
320 | 320 |
} |
321 | 321 |
|
322 | 322 |
close(fd); |
b/hw/loader.h | ||
---|---|---|
5 | 5 |
int get_image_size(const char *filename); |
6 | 6 |
int load_image(const char *filename, uint8_t *addr); /* deprecated */ |
7 | 7 |
int load_image_targphys(const char *filename, target_phys_addr_t, int max_sz); |
8 |
int load_elf(const char *filename, int64_t address_offset, |
|
9 |
uint64_t *pentry, uint64_t *lowaddr, uint64_t *highaddr, |
|
10 |
int big_endian, int elf_machine, int clear_lsb); |
|
8 |
int load_elf(const char *filename, uint64_t (*translate_fn)(void *, uint64_t), |
|
9 |
void *translate_opaque, uint64_t *pentry, uint64_t *lowaddr, |
|
10 |
uint64_t *highaddr, int big_endian, int elf_machine, |
|
11 |
int clear_lsb); |
|
11 | 12 |
int load_aout(const char *filename, target_phys_addr_t addr, int max_sz, |
12 | 13 |
int bswap_needed, target_phys_addr_t target_page_size); |
13 | 14 |
int load_uimage(const char *filename, target_phys_addr_t *ep, |
b/hw/mcf5208.c | ||
---|---|---|
270 | 270 |
exit(1); |
271 | 271 |
} |
272 | 272 |
|
273 |
kernel_size = load_elf(kernel_filename, 0, &elf_entry, NULL, NULL,
|
|
274 |
1, ELF_MACHINE, 0); |
|
273 |
kernel_size = load_elf(kernel_filename, NULL, NULL, &elf_entry,
|
|
274 |
NULL, NULL, 1, ELF_MACHINE, 0);
|
|
275 | 275 |
entry = elf_entry; |
276 | 276 |
if (kernel_size < 0) { |
277 | 277 |
kernel_size = load_uimage(kernel_filename, &entry, NULL, NULL); |
b/hw/mips.h | ||
---|---|---|
20 | 20 |
/* jazz_led.c */ |
21 | 21 |
extern void jazz_led_init(target_phys_addr_t base); |
22 | 22 |
|
23 |
/* mips_addr.c */ |
|
24 |
uint64_t cpu_mips_kseg0_to_phys(void *opaque, uint64_t addr); |
|
25 |
uint64_t cpu_mips_phys_to_kseg0(void *opaque, uint64_t addr); |
|
26 |
|
|
23 | 27 |
/* mips_int.c */ |
24 | 28 |
extern void cpu_mips_irq_init_cpu(CPUState *env); |
25 | 29 |
|
b/hw/mips_addr.c | ||
---|---|---|
1 |
/* |
|
2 |
* QEMU MIPS address translation support |
|
3 |
* |
|
4 |
* Permission is hereby granted, free of charge, to any person obtaining a copy |
|
5 |
* of this software and associated documentation files (the "Software"), to deal |
|
6 |
* in the Software without restriction, including without limitation the rights |
|
7 |
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
8 |
* copies of the Software, and to permit persons to whom the Software is |
|
9 |
* furnished to do so, subject to the following conditions: |
|
10 |
* |
|
11 |
* The above copyright notice and this permission notice shall be included in |
|
12 |
* all copies or substantial portions of the Software. |
|
13 |
* |
|
14 |
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
15 |
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
16 |
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
|
17 |
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
18 |
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
19 |
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|
20 |
* THE SOFTWARE. |
|
21 |
*/ |
|
22 |
|
|
23 |
#include "hw.h" |
|
24 |
#include "mips.h" |
|
25 |
|
|
26 |
uint64_t cpu_mips_kseg0_to_phys(void *opaque, uint64_t addr) |
|
27 |
{ |
|
28 |
return addr & 0x7fffffffll; |
|
29 |
} |
|
30 |
|
|
31 |
uint64_t cpu_mips_phys_to_kseg0(void *opaque, uint64_t addr) |
|
32 |
{ |
|
33 |
return addr | ~0x7fffffffll; |
|
34 |
} |
b/hw/mips_malta.c | ||
---|---|---|
46 | 46 |
|
47 | 47 |
//#define DEBUG_BOARD_INIT |
48 | 48 |
|
49 |
#ifdef TARGET_MIPS64 |
|
50 |
#define PHYS_TO_VIRT(x) ((x) | ~0x7fffffffULL) |
|
51 |
#else |
|
52 |
#define PHYS_TO_VIRT(x) ((x) | ~0x7fffffffU) |
|
53 |
#endif |
|
54 |
|
|
55 |
#define ENVP_ADDR (int32_t)0x80002000 |
|
56 |
#define VIRT_TO_PHYS_ADDEND (-((int64_t)(int32_t)0x80000000)) |
|
57 |
|
|
49 |
#define ENVP_ADDR 0x80002000l |
|
58 | 50 |
#define ENVP_NB_ENTRIES 16 |
59 | 51 |
#define ENVP_ENTRY_SIZE 256 |
60 | 52 |
|
... | ... | |
681 | 673 |
/* Kernel */ |
682 | 674 |
static int64_t load_kernel (void) |
683 | 675 |
{ |
684 |
int64_t kernel_entry, kernel_low, kernel_high;
|
|
676 |
int64_t kernel_entry, kernel_high; |
|
685 | 677 |
long initrd_size; |
686 | 678 |
ram_addr_t initrd_offset; |
687 | 679 |
int big_endian; |
... | ... | |
695 | 687 |
big_endian = 0; |
696 | 688 |
#endif |
697 | 689 |
|
698 |
if (load_elf(loaderparams.kernel_filename, VIRT_TO_PHYS_ADDEND,
|
|
699 |
(uint64_t *)&kernel_entry, (uint64_t *)&kernel_low,
|
|
700 |
(uint64_t *)&kernel_high, big_endian, ELF_MACHINE, 1) < 0) {
|
|
690 |
if (load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys, NULL,
|
|
691 |
(uint64_t *)&kernel_entry, NULL, (uint64_t *)&kernel_high,
|
|
692 |
big_endian, ELF_MACHINE, 1) < 0) { |
|
701 | 693 |
fprintf(stderr, "qemu: could not load kernel '%s'\n", |
702 | 694 |
loaderparams.kernel_filename); |
703 | 695 |
exit(1); |
... | ... | |
733 | 725 |
|
734 | 726 |
prom_set(prom_buf, prom_index++, loaderparams.kernel_filename); |
735 | 727 |
if (initrd_size > 0) { |
736 |
prom_set(prom_buf, prom_index++, "rd_start=0x" TARGET_FMT_lx " rd_size=%li %s",
|
|
737 |
PHYS_TO_VIRT(initrd_offset), initrd_size,
|
|
728 |
prom_set(prom_buf, prom_index++, "rd_start=0x%" PRIx64 " rd_size=%li %s",
|
|
729 |
cpu_mips_phys_to_kseg0(NULL, initrd_offset), initrd_size,
|
|
738 | 730 |
loaderparams.kernel_cmdline); |
739 | 731 |
} else { |
740 | 732 |
prom_set(prom_buf, prom_index++, loaderparams.kernel_cmdline); |
... | ... | |
747 | 739 |
prom_set(prom_buf, prom_index++, NULL); |
748 | 740 |
|
749 | 741 |
rom_add_blob_fixed("prom", prom_buf, prom_size, |
750 |
ENVP_ADDR + VIRT_TO_PHYS_ADDEND);
|
|
742 |
cpu_mips_kseg0_to_phys(NULL, ENVP_ADDR));
|
|
751 | 743 |
|
752 | 744 |
return kernel_entry; |
753 | 745 |
} |
b/hw/mips_mipssim.c | ||
---|---|---|
35 | 35 |
#include "loader.h" |
36 | 36 |
#include "elf.h" |
37 | 37 |
|
38 |
#ifdef TARGET_MIPS64 |
|
39 |
#define PHYS_TO_VIRT(x) ((x) | ~0x7fffffffULL) |
|
40 |
#else |
|
41 |
#define PHYS_TO_VIRT(x) ((x) | ~0x7fffffffU) |
|
42 |
#endif |
|
43 |
|
|
44 |
#define VIRT_TO_PHYS_ADDEND (-((int64_t)(int32_t)0x80000000)) |
|
45 |
|
|
46 | 38 |
static struct _loaderparams { |
47 | 39 |
int ram_size; |
48 | 40 |
const char *kernel_filename; |
... | ... | |
57 | 49 |
|
58 | 50 |
static int64_t load_kernel(void) |
59 | 51 |
{ |
60 |
int64_t entry, kernel_low, kernel_high;
|
|
52 |
int64_t entry, kernel_high; |
|
61 | 53 |
long kernel_size; |
62 | 54 |
long initrd_size; |
63 | 55 |
ram_addr_t initrd_offset; |
... | ... | |
69 | 61 |
big_endian = 0; |
70 | 62 |
#endif |
71 | 63 |
|
72 |
kernel_size = load_elf(loaderparams.kernel_filename, VIRT_TO_PHYS_ADDEND, |
|
73 |
(uint64_t *)&entry, (uint64_t *)&kernel_low, |
|
74 |
(uint64_t *)&kernel_high, big_endian, ELF_MACHINE, 1); |
|
64 |
kernel_size = load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys, |
|
65 |
NULL, (uint64_t *)&entry, NULL, |
|
66 |
(uint64_t *)&kernel_high, big_endian, |
|
67 |
ELF_MACHINE, 1); |
|
75 | 68 |
if (kernel_size >= 0) { |
76 | 69 |
if ((entry & ~0x7fffffffULL) == 0x80000000) |
77 | 70 |
entry = (int32_t)entry; |
b/hw/mips_r4k.c | ||
---|---|---|
21 | 21 |
#include "loader.h" |
22 | 22 |
#include "elf.h" |
23 | 23 |
|
24 |
#define PHYS_TO_VIRT(x) ((x) | ~(target_ulong)0x7fffffff) |
|
25 |
|
|
26 |
#define VIRT_TO_PHYS_ADDEND (-((int64_t)(int32_t)0x80000000)) |
|
27 |
|
|
28 | 24 |
#define MAX_IDE_BUS 2 |
29 | 25 |
|
30 | 26 |
static const int ide_iobase[2] = { 0x1f0, 0x170 }; |
... | ... | |
77 | 73 |
|
78 | 74 |
static int64_t load_kernel(void) |
79 | 75 |
{ |
80 |
int64_t entry, kernel_low, kernel_high;
|
|
76 |
int64_t entry, kernel_high; |
|
81 | 77 |
long kernel_size, initrd_size, params_size; |
82 | 78 |
ram_addr_t initrd_offset; |
83 | 79 |
uint32_t *params_buf; |
... | ... | |
88 | 84 |
#else |
89 | 85 |
big_endian = 0; |
90 | 86 |
#endif |
91 |
kernel_size = load_elf(loaderparams.kernel_filename, VIRT_TO_PHYS_ADDEND, |
|
92 |
(uint64_t *)&entry, (uint64_t *)&kernel_low, |
|
93 |
(uint64_t *)&kernel_high, big_endian, ELF_MACHINE, 1); |
|
87 |
kernel_size = load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys, |
|
88 |
NULL, (uint64_t *)&entry, NULL, |
|
89 |
(uint64_t *)&kernel_high, big_endian, |
|
90 |
ELF_MACHINE, 1); |
|
94 | 91 |
if (kernel_size >= 0) { |
95 | 92 |
if ((entry & ~0x7fffffffULL) == 0x80000000) |
96 | 93 |
entry = (int32_t)entry; |
... | ... | |
132 | 129 |
params_buf[1] = tswap32(0x12345678); |
133 | 130 |
|
134 | 131 |
if (initrd_size > 0) { |
135 |
snprintf((char *)params_buf + 8, 256, "rd_start=0x" TARGET_FMT_lx " rd_size=%li %s",
|
|
136 |
PHYS_TO_VIRT((uint32_t)initrd_offset),
|
|
132 |
snprintf((char *)params_buf + 8, 256, "rd_start=0x%" PRIx64 " rd_size=%li %s",
|
|
133 |
cpu_mips_phys_to_kseg0(NULL, initrd_offset),
|
|
137 | 134 |
initrd_size, loaderparams.kernel_cmdline); |
138 | 135 |
} else { |
139 | 136 |
snprintf((char *)params_buf + 8, 256, "%s", loaderparams.kernel_cmdline); |
b/hw/multiboot.c | ||
---|---|---|
170 | 170 |
uint64_t elf_low, elf_high; |
171 | 171 |
int kernel_size; |
172 | 172 |
fclose(f); |
173 |
kernel_size = load_elf(kernel_filename, 0, &elf_entry, &elf_low, &elf_high,
|
|
174 |
0, ELF_MACHINE, 0); |
|
173 |
kernel_size = load_elf(kernel_filename, NULL, NULL, &elf_entry,
|
|
174 |
&elf_low, &elf_high, 0, ELF_MACHINE, 0);
|
|
175 | 175 |
if (kernel_size < 0) { |
176 | 176 |
fprintf(stderr, "Error while loading elf kernel\n"); |
177 | 177 |
exit(1); |
b/hw/petalogix_s3adsp1800_mmu.c | ||
---|---|---|
104 | 104 |
return fdt_size; |
105 | 105 |
} |
106 | 106 |
|
107 |
static uint64_t translate_kernel_address(void *opaque, uint64_t addr) |
|
108 |
{ |
|
109 |
return addr - 0x30000000LL; |
|
110 |
} |
|
111 |
|
|
107 | 112 |
static void |
108 | 113 |
petalogix_s3adsp1800_init(ram_addr_t ram_size, |
109 | 114 |
const char *boot_device, |
... | ... | |
163 | 168 |
uint32_t base32; |
164 | 169 |
|
165 | 170 |
/* Boots a kernel elf binary. */ |
166 |
kernel_size = load_elf(kernel_filename, 0,
|
|
171 |
kernel_size = load_elf(kernel_filename, NULL, NULL,
|
|
167 | 172 |
&entry, &low, &high, |
168 | 173 |
1, ELF_MACHINE, 0); |
169 | 174 |
base32 = entry; |
170 | 175 |
if (base32 == 0xc0000000) { |
171 |
kernel_size = load_elf(kernel_filename, -0x30000000LL,
|
|
172 |
&entry, NULL, NULL, |
|
176 |
kernel_size = load_elf(kernel_filename, translate_kernel_address,
|
|
177 |
NULL, &entry, NULL, NULL,
|
|
173 | 178 |
1, ELF_MACHINE, 0); |
174 | 179 |
} |
175 | 180 |
/* Always boot into physical ram. */ |
b/hw/ppc440_bamboo.c | ||
---|---|---|
120 | 120 |
if (kernel_filename) { |
121 | 121 |
kernel_size = load_uimage(kernel_filename, &entry, &loadaddr, NULL); |
122 | 122 |
if (kernel_size < 0) { |
123 |
kernel_size = load_elf(kernel_filename, 0, &elf_entry, &elf_lowaddr,
|
|
124 |
NULL, 1, ELF_MACHINE, 0); |
|
123 |
kernel_size = load_elf(kernel_filename, NULL, NULL, &elf_entry,
|
|
124 |
&elf_lowaddr, NULL, 1, ELF_MACHINE, 0);
|
|
125 | 125 |
entry = elf_entry; |
126 | 126 |
loadaddr = elf_lowaddr; |
127 | 127 |
} |
b/hw/ppc_newworld.c | ||
---|---|---|
115 | 115 |
return 0; |
116 | 116 |
} |
117 | 117 |
|
118 |
static uint64_t translate_kernel_address(void *opaque, uint64_t addr) |
|
119 |
{ |
|
120 |
return (addr & 0x0fffffff) + KERNEL_LOAD_ADDR; |
|
121 |
} |
|
122 |
|
|
118 | 123 |
/* PowerPC Mac99 hardware initialisation */ |
119 | 124 |
static void ppc_core99_init (ram_addr_t ram_size, |
120 | 125 |
const char *boot_device, |
... | ... | |
180 | 185 |
|
181 | 186 |
/* Load OpenBIOS (ELF) */ |
182 | 187 |
if (filename) { |
183 |
bios_size = load_elf(filename, 0, NULL, NULL, NULL, 1, ELF_MACHINE, 0); |
|
188 |
bios_size = load_elf(filename, NULL, NULL, NULL, |
|
189 |
NULL, NULL, 1, ELF_MACHINE, 0); |
|
184 | 190 |
|
185 | 191 |
qemu_free(filename); |
186 | 192 |
} else { |
... | ... | |
232 | 238 |
#endif |
233 | 239 |
kernel_base = KERNEL_LOAD_ADDR; |
234 | 240 |
|
235 |
/* Now we can load the kernel. The first step tries to load the kernel |
|
236 |
supposing PhysAddr = 0x00000000. If that was wrong the kernel is |
|
237 |
loaded again, the new PhysAddr being computed from lowaddr. */ |
|
238 |
kernel_size = load_elf(kernel_filename, kernel_base, NULL, &lowaddr, NULL, |
|
239 |
1, ELF_MACHINE, 0); |
|
240 |
if (kernel_size > 0 && lowaddr != KERNEL_LOAD_ADDR) { |
|
241 |
kernel_size = load_elf(kernel_filename, (2 * kernel_base) - lowaddr, |
|
242 |
NULL, NULL, NULL, 1, ELF_MACHINE, 0); |
|
243 |
} |
|
241 |
kernel_size = load_elf(kernel_filename, translate_kernel_address, NULL, |
|
242 |
NULL, &lowaddr, NULL, 1, ELF_MACHINE, 0); |
|
244 | 243 |
if (kernel_size < 0) |
245 | 244 |
kernel_size = load_aout(kernel_filename, kernel_base, |
246 | 245 |
ram_size - kernel_base, bswap_needed, |
b/hw/ppc_oldworld.c | ||
---|---|---|
122 | 122 |
return 0; |
123 | 123 |
} |
124 | 124 |
|
125 |
|
|
126 |
static uint64_t translate_kernel_address(void *opaque, uint64_t addr) |
|
127 |
{ |
|
128 |
return (addr & 0x0fffffff) + KERNEL_LOAD_ADDR; |
|
129 |
} |
|
130 |
|
|
125 | 131 |
static void ppc_heathrow_init (ram_addr_t ram_size, |
126 | 132 |
const char *boot_device, |
127 | 133 |
const char *kernel_filename, |
... | ... | |
185 | 191 |
|
186 | 192 |
/* Load OpenBIOS (ELF) */ |
187 | 193 |
if (filename) { |
188 |
bios_size = load_elf(filename, 0, NULL, NULL, NULL, |
|
189 |
1, ELF_MACHINE, 0);
|
|
194 |
bios_size = load_elf(filename, 0, NULL, NULL, NULL, NULL,
|
|
195 |
1, ELF_MACHINE, 0); |
|
190 | 196 |
qemu_free(filename); |
191 | 197 |
} else { |
192 | 198 |
bios_size = -1; |
... | ... | |
236 | 242 |
bswap_needed = 0; |
237 | 243 |
#endif |
238 | 244 |
kernel_base = KERNEL_LOAD_ADDR; |
239 |
/* Now we can load the kernel. The first step tries to load the kernel |
|
240 |
supposing PhysAddr = 0x00000000. If that was wrong the kernel is |
|
241 |
loaded again, the new PhysAddr being computed from lowaddr. */ |
|
242 |
kernel_size = load_elf(kernel_filename, kernel_base, NULL, &lowaddr, NULL, |
|
243 |
1, ELF_MACHINE, 0); |
|
244 |
if (kernel_size > 0 && lowaddr != KERNEL_LOAD_ADDR) { |
|
245 |
kernel_size = load_elf(kernel_filename, (2 * kernel_base) - lowaddr, |
|
246 |
NULL, NULL, NULL, 1, ELF_MACHINE, 0); |
|
247 |
} |
|
245 |
kernel_size = load_elf(kernel_filename, translate_kernel_address, NULL, |
|
246 |
NULL, &lowaddr, NULL, 1, ELF_MACHINE, 0); |
|
248 | 247 |
if (kernel_size < 0) |
249 | 248 |
kernel_size = load_aout(kernel_filename, kernel_base, |
250 | 249 |
ram_size - kernel_base, bswap_needed, |
b/hw/ppce500_mpc8544ds.c | ||
---|---|---|
231 | 231 |
if (kernel_filename) { |
232 | 232 |
kernel_size = load_uimage(kernel_filename, &entry, &loadaddr, NULL); |
233 | 233 |
if (kernel_size < 0) { |
234 |
kernel_size = load_elf(kernel_filename, 0, &elf_entry, &elf_lowaddr,
|
|
235 |
NULL, 1, ELF_MACHINE, 0); |
|
234 |
kernel_size = load_elf(kernel_filename, NULL, NULL, &elf_entry,
|
|
235 |
&elf_lowaddr, NULL, 1, ELF_MACHINE, 0);
|
|
236 | 236 |
entry = elf_entry; |
237 | 237 |
loadaddr = elf_lowaddr; |
238 | 238 |
} |
b/hw/sun4m.c | ||
---|---|---|
292 | 292 |
cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HALT); |
293 | 293 |
} |
294 | 294 |
|
295 |
static uint64_t translate_kernel_address(void *opaque, uint64_t addr) |
|
296 |
{ |
|
297 |
return addr - 0xf0000000ULL; |
|
298 |
} |
|
299 |
|
|
295 | 300 |
static unsigned long sun4m_load_kernel(const char *kernel_filename, |
296 | 301 |
const char *initrd_filename, |
297 | 302 |
ram_addr_t RAM_size) |
... | ... | |
312 | 317 |
#else |
313 | 318 |
bswap_needed = 0; |
314 | 319 |
#endif |
315 |
kernel_size = load_elf(kernel_filename, -0xf0000000ULL, NULL, NULL,
|
|
316 |
NULL, 1, ELF_MACHINE, 0); |
|
320 |
kernel_size = load_elf(kernel_filename, translate_kernel_address, NULL,
|
|
321 |
NULL, NULL, NULL, 1, ELF_MACHINE, 0);
|
|
317 | 322 |
if (kernel_size < 0) |
318 | 323 |
kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR, |
319 | 324 |
RAM_size - KERNEL_LOAD_ADDR, bswap_needed, |
... | ... | |
636 | 641 |
device_init(afx_register_devices); |
637 | 642 |
|
638 | 643 |
/* Boot PROM (OpenBIOS) */ |
644 |
static uint64_t translate_prom_address(void *opaque, uint64_t addr) |
|
645 |
{ |
|
646 |
target_phys_addr_t *base_addr = (target_phys_addr_t *)opaque; |
|
647 |
return addr + *base_addr - PROM_VADDR; |
|
648 |
} |
|
649 |
|
|
639 | 650 |
static void prom_init(target_phys_addr_t addr, const char *bios_name) |
640 | 651 |
{ |
641 | 652 |
DeviceState *dev; |
... | ... | |
655 | 666 |
} |
656 | 667 |
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); |
657 | 668 |
if (filename) { |
658 |
ret = load_elf(filename, addr - PROM_VADDR, NULL, NULL, NULL,
|
|
659 |
1, ELF_MACHINE, 0); |
|
669 |
ret = load_elf(filename, translate_prom_address, &addr, NULL,
|
|
670 |
NULL, NULL, 1, ELF_MACHINE, 0);
|
|
660 | 671 |
if (ret < 0 || ret > PROM_SIZE_MAX) { |
661 | 672 |
ret = load_image_targphys(filename, addr, PROM_SIZE_MAX); |
662 | 673 |
} |
b/hw/sun4u.c | ||
---|---|---|
189 | 189 |
#else |
190 | 190 |
bswap_needed = 0; |
191 | 191 |
#endif |
192 |
kernel_size = load_elf(kernel_filename, 0, NULL, NULL, NULL,
|
|
193 |
1, ELF_MACHINE, 0); |
|
192 |
kernel_size = load_elf(kernel_filename, NULL, NULL, NULL, |
|
193 |
NULL, NULL, 1, ELF_MACHINE, 0);
|
|
194 | 194 |
if (kernel_size < 0) |
195 | 195 |
kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR, |
196 | 196 |
RAM_size - KERNEL_LOAD_ADDR, bswap_needed, |
... | ... | |
580 | 580 |
|
581 | 581 |
device_init(pci_ebus_register); |
582 | 582 |
|
583 |
static uint64_t translate_prom_address(void *opaque, uint64_t addr) |
|
584 |
{ |
|
585 |
target_phys_addr_t *base_addr = (target_phys_addr_t *)opaque; |
|
586 |
return addr + *base_addr - PROM_VADDR; |
|
587 |
} |
|
588 |
|
|
583 | 589 |
/* Boot PROM (OpenBIOS) */ |
584 | 590 |
static void prom_init(target_phys_addr_t addr, const char *bios_name) |
585 | 591 |
{ |
... | ... | |
600 | 606 |
} |
601 | 607 |
filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); |
602 | 608 |
if (filename) { |
603 |
ret = load_elf(filename, addr - PROM_VADDR, NULL, NULL, NULL,
|
|
604 |
1, ELF_MACHINE, 0); |
|
609 |
ret = load_elf(filename, translate_prom_address, &addr,
|
|
610 |
NULL, NULL, NULL, 1, ELF_MACHINE, 0);
|
|
605 | 611 |
if (ret < 0 || ret > PROM_SIZE_MAX) { |
606 | 612 |
ret = load_image_targphys(filename, addr, PROM_SIZE_MAX); |
607 | 613 |
} |
Also available in: Unified diff