Commit b37837317fb3177755c592591d7f53826c6afae5
1 parent
5fe141fd
use generic ELF loader
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1832 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
13 additions
and
427 deletions
hw/elf_ops.h deleted
100644 → 0
1 | -#ifdef BSWAP_NEEDED | |
2 | -static void glue(bswap_ehdr, SZ)(struct elfhdr *ehdr) | |
3 | -{ | |
4 | - bswap16s(&ehdr->e_type); /* Object file type */ | |
5 | - bswap16s(&ehdr->e_machine); /* Architecture */ | |
6 | - bswap32s(&ehdr->e_version); /* Object file version */ | |
7 | - bswapSZs(&ehdr->e_entry); /* Entry point virtual address */ | |
8 | - bswapSZs(&ehdr->e_phoff); /* Program header table file offset */ | |
9 | - bswapSZs(&ehdr->e_shoff); /* Section header table file offset */ | |
10 | - bswap32s(&ehdr->e_flags); /* Processor-specific flags */ | |
11 | - bswap16s(&ehdr->e_ehsize); /* ELF header size in bytes */ | |
12 | - bswap16s(&ehdr->e_phentsize); /* Program header table entry size */ | |
13 | - bswap16s(&ehdr->e_phnum); /* Program header table entry count */ | |
14 | - bswap16s(&ehdr->e_shentsize); /* Section header table entry size */ | |
15 | - bswap16s(&ehdr->e_shnum); /* Section header table entry count */ | |
16 | - bswap16s(&ehdr->e_shstrndx); /* Section header string table index */ | |
17 | -} | |
18 | - | |
19 | -static void glue(bswap_phdr, SZ)(struct elf_phdr *phdr) | |
20 | -{ | |
21 | - bswap32s(&phdr->p_type); /* Segment type */ | |
22 | - bswapSZs(&phdr->p_offset); /* Segment file offset */ | |
23 | - bswapSZs(&phdr->p_vaddr); /* Segment virtual address */ | |
24 | - bswapSZs(&phdr->p_paddr); /* Segment physical address */ | |
25 | - bswapSZs(&phdr->p_filesz); /* Segment size in file */ | |
26 | - bswapSZs(&phdr->p_memsz); /* Segment size in memory */ | |
27 | - bswap32s(&phdr->p_flags); /* Segment flags */ | |
28 | - bswapSZs(&phdr->p_align); /* Segment alignment */ | |
29 | -} | |
30 | - | |
31 | -static void glue(bswap_shdr, SZ)(struct elf_shdr *shdr) | |
32 | -{ | |
33 | - bswap32s(&shdr->sh_name); | |
34 | - bswap32s(&shdr->sh_type); | |
35 | - bswapSZs(&shdr->sh_flags); | |
36 | - bswapSZs(&shdr->sh_addr); | |
37 | - bswapSZs(&shdr->sh_offset); | |
38 | - bswapSZs(&shdr->sh_size); | |
39 | - bswap32s(&shdr->sh_link); | |
40 | - bswap32s(&shdr->sh_info); | |
41 | - bswapSZs(&shdr->sh_addralign); | |
42 | - bswapSZs(&shdr->sh_entsize); | |
43 | -} | |
44 | - | |
45 | -static void glue(bswap_sym, SZ)(struct elf_sym *sym) | |
46 | -{ | |
47 | - bswap32s(&sym->st_name); | |
48 | - bswapSZs(&sym->st_value); | |
49 | - bswapSZs(&sym->st_size); | |
50 | - bswap16s(&sym->st_shndx); | |
51 | -} | |
52 | -#endif | |
53 | - | |
54 | -static int glue(find_phdr, SZ)(struct elfhdr *ehdr, int fd, struct elf_phdr *phdr, elf_word type) | |
55 | -{ | |
56 | - int i, retval; | |
57 | - | |
58 | - retval = lseek(fd, ehdr->e_phoff, SEEK_SET); | |
59 | - if (retval < 0) | |
60 | - return -1; | |
61 | - | |
62 | - for (i = 0; i < ehdr->e_phnum; i++) { | |
63 | - retval = read(fd, phdr, sizeof(*phdr)); | |
64 | - if (retval < 0) | |
65 | - return -1; | |
66 | - glue(bswap_phdr, SZ)(phdr); | |
67 | - if (phdr->p_type == type) | |
68 | - return 0; | |
69 | - } | |
70 | - return -1; | |
71 | -} | |
72 | - | |
73 | -static void * glue(find_shdr, SZ)(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, elf_word type) | |
74 | -{ | |
75 | - int i, retval; | |
76 | - | |
77 | - retval = lseek(fd, ehdr->e_shoff, SEEK_SET); | |
78 | - if (retval < 0) | |
79 | - return NULL; | |
80 | - | |
81 | - for (i = 0; i < ehdr->e_shnum; i++) { | |
82 | - retval = read(fd, shdr, sizeof(*shdr)); | |
83 | - if (retval < 0) | |
84 | - return NULL; | |
85 | - glue(bswap_shdr, SZ)(shdr); | |
86 | - if (shdr->sh_type == type) | |
87 | - return qemu_malloc(shdr->sh_size); | |
88 | - } | |
89 | - return NULL; | |
90 | -} | |
91 | - | |
92 | -static void * glue(find_strtab, SZ)(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, struct elf_shdr *symtab) | |
93 | -{ | |
94 | - int retval; | |
95 | - | |
96 | - retval = lseek(fd, ehdr->e_shoff + sizeof(struct elf_shdr) * symtab->sh_link, SEEK_SET); | |
97 | - if (retval < 0) | |
98 | - return NULL; | |
99 | - | |
100 | - retval = read(fd, shdr, sizeof(*shdr)); | |
101 | - if (retval < 0) | |
102 | - return NULL; | |
103 | - glue(bswap_shdr, SZ)(shdr); | |
104 | - if (shdr->sh_type == SHT_STRTAB) | |
105 | - return qemu_malloc(shdr->sh_size);; | |
106 | - return NULL; | |
107 | -} | |
108 | - | |
109 | -static int glue(read_program, SZ)(int fd, struct elf_phdr *phdr, void *dst, elf_word entry) | |
110 | -{ | |
111 | - int retval; | |
112 | - retval = lseek(fd, phdr->p_offset + entry - phdr->p_vaddr, SEEK_SET); | |
113 | - if (retval < 0) | |
114 | - return -1; | |
115 | - return read(fd, dst, phdr->p_filesz); | |
116 | -} | |
117 | - | |
118 | -static int glue(read_section, SZ)(int fd, struct elf_shdr *s, void *dst) | |
119 | -{ | |
120 | - int retval; | |
121 | - | |
122 | - retval = lseek(fd, s->sh_offset, SEEK_SET); | |
123 | - if (retval < 0) | |
124 | - return -1; | |
125 | - retval = read(fd, dst, s->sh_size); | |
126 | - if (retval < 0) | |
127 | - return -1; | |
128 | - return 0; | |
129 | -} | |
130 | - | |
131 | -static void * glue(process_section, SZ)(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, elf_word type) | |
132 | -{ | |
133 | - void *dst; | |
134 | - | |
135 | - dst = glue(find_shdr, SZ)(ehdr, fd, shdr, type); | |
136 | - if (!dst) | |
137 | - goto error; | |
138 | - | |
139 | - if (glue(read_section, SZ)(fd, shdr, dst)) | |
140 | - goto error; | |
141 | - return dst; | |
142 | - error: | |
143 | - qemu_free(dst); | |
144 | - return NULL; | |
145 | -} | |
146 | - | |
147 | -static void * glue(process_strtab, SZ)(struct elfhdr *ehdr, int fd, struct elf_shdr *shdr, struct elf_shdr *symtab) | |
148 | -{ | |
149 | - void *dst; | |
150 | - | |
151 | - dst = glue(find_strtab, SZ)(ehdr, fd, shdr, symtab); | |
152 | - if (!dst) | |
153 | - goto error; | |
154 | - | |
155 | - if (glue(read_section, SZ)(fd, shdr, dst)) | |
156 | - goto error; | |
157 | - return dst; | |
158 | - error: | |
159 | - qemu_free(dst); | |
160 | - return NULL; | |
161 | -} | |
162 | - | |
163 | -static void glue(load_symbols, SZ)(struct elfhdr *ehdr, int fd) | |
164 | -{ | |
165 | - struct elf_shdr symtab, strtab; | |
166 | - struct elf_sym *syms; | |
167 | -#if (SZ == 64) | |
168 | - struct elf32_sym *syms32; | |
169 | -#endif | |
170 | - struct syminfo *s; | |
171 | - int nsyms, i; | |
172 | - char *str; | |
173 | - | |
174 | - /* Symbol table */ | |
175 | - syms = glue(process_section, SZ)(ehdr, fd, &symtab, SHT_SYMTAB); | |
176 | - if (!syms) | |
177 | - return; | |
178 | - | |
179 | - nsyms = symtab.sh_size / sizeof(struct elf_sym); | |
180 | -#if (SZ == 64) | |
181 | - syms32 = qemu_mallocz(nsyms * sizeof(struct elf32_sym)); | |
182 | -#endif | |
183 | - for (i = 0; i < nsyms; i++) { | |
184 | - glue(bswap_sym, SZ)(&syms[i]); | |
185 | -#if (SZ == 64) | |
186 | - syms32[i].st_name = syms[i].st_name; | |
187 | - syms32[i].st_info = syms[i].st_info; | |
188 | - syms32[i].st_other = syms[i].st_other; | |
189 | - syms32[i].st_shndx = syms[i].st_shndx; | |
190 | - syms32[i].st_value = syms[i].st_value & 0xffffffff; | |
191 | - syms32[i].st_size = syms[i].st_size & 0xffffffff; | |
192 | -#endif | |
193 | - } | |
194 | - /* String table */ | |
195 | - str = glue(process_strtab, SZ)(ehdr, fd, &strtab, &symtab); | |
196 | - if (!str) | |
197 | - goto error_freesyms; | |
198 | - | |
199 | - /* Commit */ | |
200 | - s = qemu_mallocz(sizeof(*s)); | |
201 | -#if (SZ == 64) | |
202 | - s->disas_symtab = syms32; | |
203 | - qemu_free(syms); | |
204 | -#else | |
205 | - s->disas_symtab = syms; | |
206 | -#endif | |
207 | - s->disas_num_syms = nsyms; | |
208 | - s->disas_strtab = str; | |
209 | - s->next = syminfos; | |
210 | - syminfos = s; | |
211 | - return; | |
212 | - error_freesyms: | |
213 | -#if (SZ == 64) | |
214 | - qemu_free(syms32); | |
215 | -#endif | |
216 | - qemu_free(syms); | |
217 | - return; | |
218 | -} |
hw/magic-load.c deleted
100644 → 0
1 | -#include "vl.h" | |
2 | -#include "disas.h" | |
3 | -#include "exec-all.h" | |
4 | - | |
5 | -struct exec | |
6 | -{ | |
7 | - uint32_t a_info; /* Use macros N_MAGIC, etc for access */ | |
8 | - uint32_t a_text; /* length of text, in bytes */ | |
9 | - uint32_t a_data; /* length of data, in bytes */ | |
10 | - uint32_t a_bss; /* length of uninitialized data area, in bytes */ | |
11 | - uint32_t a_syms; /* length of symbol table data in file, in bytes */ | |
12 | - uint32_t a_entry; /* start address */ | |
13 | - uint32_t a_trsize; /* length of relocation info for text, in bytes */ | |
14 | - uint32_t a_drsize; /* length of relocation info for data, in bytes */ | |
15 | -}; | |
16 | - | |
17 | -#ifdef BSWAP_NEEDED | |
18 | -static void bswap_ahdr(struct exec *e) | |
19 | -{ | |
20 | - bswap32s(&e->a_info); | |
21 | - bswap32s(&e->a_text); | |
22 | - bswap32s(&e->a_data); | |
23 | - bswap32s(&e->a_bss); | |
24 | - bswap32s(&e->a_syms); | |
25 | - bswap32s(&e->a_entry); | |
26 | - bswap32s(&e->a_trsize); | |
27 | - bswap32s(&e->a_drsize); | |
28 | -} | |
29 | -#else | |
30 | -#define bswap_ahdr(x) do { } while (0) | |
31 | -#endif | |
32 | - | |
33 | -#define N_MAGIC(exec) ((exec).a_info & 0xffff) | |
34 | -#define OMAGIC 0407 | |
35 | -#define NMAGIC 0410 | |
36 | -#define ZMAGIC 0413 | |
37 | -#define QMAGIC 0314 | |
38 | -#define _N_HDROFF(x) (1024 - sizeof (struct exec)) | |
39 | -#define N_TXTOFF(x) \ | |
40 | - (N_MAGIC(x) == ZMAGIC ? _N_HDROFF((x)) + sizeof (struct exec) : \ | |
41 | - (N_MAGIC(x) == QMAGIC ? 0 : sizeof (struct exec))) | |
42 | -#define N_TXTADDR(x) (N_MAGIC(x) == QMAGIC ? TARGET_PAGE_SIZE : 0) | |
43 | -#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text) | |
44 | -#define _N_SEGMENT_ROUND(x) (((x) + TARGET_PAGE_SIZE - 1) & ~(TARGET_PAGE_SIZE - 1)) | |
45 | - | |
46 | -#define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text) | |
47 | - | |
48 | -#define N_DATADDR(x) \ | |
49 | - (N_MAGIC(x)==OMAGIC? (_N_TXTENDADDR(x)) \ | |
50 | - : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x)))) | |
51 | - | |
52 | - | |
53 | -#define ELF_CLASS ELFCLASS32 | |
54 | -#define ELF_DATA ELFDATA2MSB | |
55 | -#define ELF_ARCH EM_SPARC | |
56 | - | |
57 | -#include "elf.h" | |
58 | - | |
59 | -#ifndef BSWAP_NEEDED | |
60 | -#define bswap_ehdr32(e) do { } while (0) | |
61 | -#define bswap_phdr32(e) do { } while (0) | |
62 | -#define bswap_shdr32(e) do { } while (0) | |
63 | -#define bswap_sym32(e) do { } while (0) | |
64 | -#ifdef TARGET_SPARC64 | |
65 | -#define bswap_ehdr64(e) do { } while (0) | |
66 | -#define bswap_phdr64(e) do { } while (0) | |
67 | -#define bswap_shdr64(e) do { } while (0) | |
68 | -#define bswap_sym64(e) do { } while (0) | |
69 | -#endif | |
70 | -#endif | |
71 | - | |
72 | -#define SZ 32 | |
73 | -#define elf_word uint32_t | |
74 | -#define bswapSZs bswap32s | |
75 | -#include "elf_ops.h" | |
76 | - | |
77 | -#ifdef TARGET_SPARC64 | |
78 | -#undef elfhdr | |
79 | -#undef elf_phdr | |
80 | -#undef elf_shdr | |
81 | -#undef elf_sym | |
82 | -#undef elf_note | |
83 | -#undef elf_word | |
84 | -#undef bswapSZs | |
85 | -#undef SZ | |
86 | -#define elfhdr elf64_hdr | |
87 | -#define elf_phdr elf64_phdr | |
88 | -#define elf_note elf64_note | |
89 | -#define elf_shdr elf64_shdr | |
90 | -#define elf_sym elf64_sym | |
91 | -#define elf_word uint64_t | |
92 | -#define bswapSZs bswap64s | |
93 | -#define SZ 64 | |
94 | -#include "elf_ops.h" | |
95 | -#endif | |
96 | - | |
97 | -int load_elf(const char *filename, uint8_t *addr) | |
98 | -{ | |
99 | - struct elf32_hdr ehdr; | |
100 | - int retval, fd; | |
101 | - Elf32_Half machine; | |
102 | - | |
103 | - fd = open(filename, O_RDONLY | O_BINARY); | |
104 | - if (fd < 0) | |
105 | - goto error; | |
106 | - | |
107 | - retval = read(fd, &ehdr, sizeof(ehdr)); | |
108 | - if (retval < 0) | |
109 | - goto error; | |
110 | - | |
111 | - if (ehdr.e_ident[0] != 0x7f || ehdr.e_ident[1] != 'E' | |
112 | - || ehdr.e_ident[2] != 'L' || ehdr.e_ident[3] != 'F') | |
113 | - goto error; | |
114 | - machine = tswap16(ehdr.e_machine); | |
115 | - if (machine == EM_SPARC || machine == EM_SPARC32PLUS) { | |
116 | - struct elf32_phdr phdr; | |
117 | - | |
118 | - bswap_ehdr32(&ehdr); | |
119 | - | |
120 | - if (find_phdr32(&ehdr, fd, &phdr, PT_LOAD)) | |
121 | - goto error; | |
122 | - retval = read_program32(fd, &phdr, addr, ehdr.e_entry); | |
123 | - if (retval < 0) | |
124 | - goto error; | |
125 | - load_symbols32(&ehdr, fd); | |
126 | - } | |
127 | -#ifdef TARGET_SPARC64 | |
128 | - else if (machine == EM_SPARCV9) { | |
129 | - struct elf64_hdr ehdr64; | |
130 | - struct elf64_phdr phdr; | |
131 | - | |
132 | - lseek(fd, 0, SEEK_SET); | |
133 | - | |
134 | - retval = read(fd, &ehdr64, sizeof(ehdr64)); | |
135 | - if (retval < 0) | |
136 | - goto error; | |
137 | - | |
138 | - bswap_ehdr64(&ehdr64); | |
139 | - | |
140 | - if (find_phdr64(&ehdr64, fd, &phdr, PT_LOAD)) | |
141 | - goto error; | |
142 | - retval = read_program64(fd, &phdr, phys_ram_base + ehdr64.e_entry, ehdr64.e_entry); | |
143 | - if (retval < 0) | |
144 | - goto error; | |
145 | - load_symbols64(&ehdr64, fd); | |
146 | - } | |
147 | -#endif | |
148 | - | |
149 | - close(fd); | |
150 | - return retval; | |
151 | - error: | |
152 | - close(fd); | |
153 | - return -1; | |
154 | -} | |
155 | - | |
156 | -int load_aout(const char *filename, uint8_t *addr) | |
157 | -{ | |
158 | - int fd, size, ret; | |
159 | - struct exec e; | |
160 | - uint32_t magic; | |
161 | - | |
162 | - fd = open(filename, O_RDONLY | O_BINARY); | |
163 | - if (fd < 0) | |
164 | - return -1; | |
165 | - | |
166 | - size = read(fd, &e, sizeof(e)); | |
167 | - if (size < 0) | |
168 | - goto fail; | |
169 | - | |
170 | - bswap_ahdr(&e); | |
171 | - | |
172 | - magic = N_MAGIC(e); | |
173 | - switch (magic) { | |
174 | - case ZMAGIC: | |
175 | - case QMAGIC: | |
176 | - case OMAGIC: | |
177 | - lseek(fd, N_TXTOFF(e), SEEK_SET); | |
178 | - size = read(fd, addr, e.a_text + e.a_data); | |
179 | - if (size < 0) | |
180 | - goto fail; | |
181 | - break; | |
182 | - case NMAGIC: | |
183 | - lseek(fd, N_TXTOFF(e), SEEK_SET); | |
184 | - size = read(fd, addr, e.a_text); | |
185 | - if (size < 0) | |
186 | - goto fail; | |
187 | - ret = read(fd, addr + N_DATADDR(e), e.a_data); | |
188 | - if (ret < 0) | |
189 | - goto fail; | |
190 | - size += ret; | |
191 | - break; | |
192 | - default: | |
193 | - goto fail; | |
194 | - } | |
195 | - close(fd); | |
196 | - return size; | |
197 | - fail: | |
198 | - close(fd); | |
199 | - return -1; | |
200 | -} | |
201 | - |
hw/sun4m.c
... | ... | @@ -26,6 +26,7 @@ |
26 | 26 | #define KERNEL_LOAD_ADDR 0x00004000 |
27 | 27 | #define CMDLINE_ADDR 0x007ff000 |
28 | 28 | #define INITRD_LOAD_ADDR 0x00800000 |
29 | +#define PROM_SIZE_MAX (256 * 1024) | |
29 | 30 | #define PROM_ADDR 0xffd00000 |
30 | 31 | #define PROM_FILENAMEB "proll.bin" |
31 | 32 | #define PROM_FILENAMEE "proll.elf" |
... | ... | @@ -263,9 +264,12 @@ static void sun4m_init(int ram_size, int vga_ram_size, int boot_device, |
263 | 264 | slavio_misc = slavio_misc_init(PHYS_JJ_SLAVIO, PHYS_JJ_ME_IRQ); |
264 | 265 | |
265 | 266 | prom_offset = ram_size + vram_size; |
267 | + cpu_register_physical_memory(PROM_ADDR, | |
268 | + (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK, | |
269 | + prom_offset | IO_MEM_ROM); | |
266 | 270 | |
267 | 271 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEE); |
268 | - ret = load_elf(buf, phys_ram_base + prom_offset); | |
272 | + ret = load_elf(buf, 0); | |
269 | 273 | if (ret < 0) { |
270 | 274 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEB); |
271 | 275 | ret = load_image(buf, phys_ram_base + prom_offset); |
... | ... | @@ -275,12 +279,10 @@ static void sun4m_init(int ram_size, int vga_ram_size, int boot_device, |
275 | 279 | buf); |
276 | 280 | exit(1); |
277 | 281 | } |
278 | - cpu_register_physical_memory(PROM_ADDR, (ret + TARGET_PAGE_SIZE) & TARGET_PAGE_MASK, | |
279 | - prom_offset | IO_MEM_ROM); | |
280 | 282 | |
281 | 283 | kernel_size = 0; |
282 | 284 | if (linux_boot) { |
283 | - kernel_size = load_elf(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR); | |
285 | + kernel_size = load_elf(kernel_filename, -0xf0000000); | |
284 | 286 | if (kernel_size < 0) |
285 | 287 | kernel_size = load_aout(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR); |
286 | 288 | if (kernel_size < 0) | ... | ... |
hw/sun4u.c
... | ... | @@ -27,6 +27,7 @@ |
27 | 27 | #define KERNEL_LOAD_ADDR 0x00404000 |
28 | 28 | #define CMDLINE_ADDR 0x003ff000 |
29 | 29 | #define INITRD_LOAD_ADDR 0x00300000 |
30 | +#define PROM_SIZE_MAX (256 * 1024) | |
30 | 31 | #define PROM_ADDR 0x1fff0000000ULL |
31 | 32 | #define APB_SPECIAL_BASE 0x1fe00000000ULL |
32 | 33 | #define APB_MEM_BASE 0x1ff00000000ULL |
... | ... | @@ -277,9 +278,12 @@ static void sun4u_init(int ram_size, int vga_ram_size, int boot_device, |
277 | 278 | cpu_register_physical_memory(0, ram_size, 0); |
278 | 279 | |
279 | 280 | prom_offset = ram_size + vga_ram_size; |
281 | + cpu_register_physical_memory(PROM_ADDR, | |
282 | + (PROM_SIZE_MAX + TARGET_PAGE_SIZE) & TARGET_PAGE_MASK, | |
283 | + prom_offset | IO_MEM_ROM); | |
280 | 284 | |
281 | 285 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEE); |
282 | - ret = load_elf(buf, phys_ram_base + prom_offset); | |
286 | + ret = load_elf(buf, 0); | |
283 | 287 | if (ret < 0) { |
284 | 288 | snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEB); |
285 | 289 | ret = load_image(buf, phys_ram_base + prom_offset); |
... | ... | @@ -289,13 +293,12 @@ static void sun4u_init(int ram_size, int vga_ram_size, int boot_device, |
289 | 293 | buf); |
290 | 294 | exit(1); |
291 | 295 | } |
292 | - cpu_register_physical_memory(PROM_ADDR, (ret + TARGET_PAGE_SIZE) & TARGET_PAGE_MASK, | |
293 | - prom_offset | IO_MEM_ROM); | |
294 | 296 | |
295 | 297 | kernel_size = 0; |
296 | 298 | initrd_size = 0; |
297 | 299 | if (linux_boot) { |
298 | - kernel_size = load_elf(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR); | |
300 | + /* XXX: put correct offset */ | |
301 | + kernel_size = load_elf(kernel_filename, 0); | |
299 | 302 | if (kernel_size < 0) |
300 | 303 | kernel_size = load_aout(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR); |
301 | 304 | if (kernel_size < 0) | ... | ... |