Commit 9ee3c029425a20ed16831c92c4cb3e192a909a61

Authored by bellard
1 parent 94ac5158

added entry parameter to ELF loader


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1859 c046a42c-6fe2-441c-8c8c-71466251a162
elf_ops.h
... ... @@ -138,13 +138,14 @@ static int glue(load_symbols, SZ)(struct elfhdr *ehdr, int fd, int must_swab)
138 138 return -1;
139 139 }
140 140  
141   -int glue(load_elf, SZ)(int fd, int64_t virt_to_phys_addend, int must_swab)
  141 +int glue(load_elf, SZ)(int fd, int64_t virt_to_phys_addend,
  142 + int must_swab, uint64_t *pentry)
142 143 {
143 144 struct elfhdr ehdr;
144 145 struct elf_phdr *phdr = NULL, *ph;
145 146 int size, i, total_size;
146 147 elf_word mem_size, addr;
147   - uint8_t *data;
  148 + uint8_t *data = NULL;
148 149  
149 150 if (read(fd, &ehdr, sizeof(ehdr)) != sizeof(ehdr))
150 151 goto fail;
... ... @@ -152,6 +153,9 @@ int glue(load_elf, SZ)(int fd, int64_t virt_to_phys_addend, int must_swab)
152 153 glue(bswap_ehdr, SZ)(&ehdr);
153 154 }
154 155  
  156 + if (pentry)
  157 + *pentry = (uint64_t)ehdr.e_entry;
  158 +
155 159 glue(load_symbols, SZ)(&ehdr, fd, must_swab);
156 160  
157 161 size = ehdr.e_phnum * sizeof(phdr[0]);
... ... @@ -176,7 +180,8 @@ int glue(load_elf, SZ)(int fd, int64_t virt_to_phys_addend, int must_swab)
176 180 /* XXX: avoid allocating */
177 181 data = qemu_mallocz(mem_size);
178 182 if (ph->p_filesz > 0) {
179   - lseek(fd, ph->p_offset, SEEK_SET);
  183 + if (lseek(fd, ph->p_offset, SEEK_SET) < 0)
  184 + goto fail;
180 185 if (read(fd, data, ph->p_filesz) != ph->p_filesz)
181 186 goto fail;
182 187 }
... ... @@ -187,10 +192,12 @@ int glue(load_elf, SZ)(int fd, int64_t virt_to_phys_addend, int must_swab)
187 192 total_size += mem_size;
188 193  
189 194 qemu_free(data);
  195 + data = NULL;
190 196 }
191 197 }
192 198 return total_size;
193 199 fail:
  200 + qemu_free(data);
194 201 qemu_free(phdr);
195 202 return -1;
196 203 }
... ...
hw/sun4m.c
... ... @@ -269,7 +269,7 @@ static void sun4m_init(int ram_size, int vga_ram_size, int boot_device,
269 269 prom_offset | IO_MEM_ROM);
270 270  
271 271 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEE);
272   - ret = load_elf(buf, 0);
  272 + ret = load_elf(buf, 0, NULL);
273 273 if (ret < 0) {
274 274 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEB);
275 275 ret = load_image(buf, phys_ram_base + prom_offset);
... ... @@ -282,7 +282,7 @@ static void sun4m_init(int ram_size, int vga_ram_size, int boot_device,
282 282  
283 283 kernel_size = 0;
284 284 if (linux_boot) {
285   - kernel_size = load_elf(kernel_filename, -0xf0000000);
  285 + kernel_size = load_elf(kernel_filename, -0xf0000000, NULL);
286 286 if (kernel_size < 0)
287 287 kernel_size = load_aout(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR);
288 288 if (kernel_size < 0)
... ...
hw/sun4u.c
... ... @@ -283,7 +283,7 @@ static void sun4u_init(int ram_size, int vga_ram_size, int boot_device,
283 283 prom_offset | IO_MEM_ROM);
284 284  
285 285 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEE);
286   - ret = load_elf(buf, 0);
  286 + ret = load_elf(buf, 0, NULL);
287 287 if (ret < 0) {
288 288 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, PROM_FILENAMEB);
289 289 ret = load_image(buf, phys_ram_base + prom_offset);
... ... @@ -298,7 +298,7 @@ static void sun4u_init(int ram_size, int vga_ram_size, int boot_device,
298 298 initrd_size = 0;
299 299 if (linux_boot) {
300 300 /* XXX: put correct offset */
301   - kernel_size = load_elf(kernel_filename, 0);
  301 + kernel_size = load_elf(kernel_filename, 0, NULL);
302 302 if (kernel_size < 0)
303 303 kernel_size = load_aout(kernel_filename, phys_ram_base + KERNEL_LOAD_ADDR);
304 304 if (kernel_size < 0)
... ...
loader.c
... ... @@ -194,7 +194,8 @@ static void *load_at(int fd, int offset, int size)
194 194 #include "elf_ops.h"
195 195  
196 196 /* return < 0 if error, otherwise the number of bytes loaded in memory */
197   -int load_elf(const char *filename, int64_t virt_to_phys_addend)
  197 +int load_elf(const char *filename, int64_t virt_to_phys_addend,
  198 + uint64_t *pentry)
198 199 {
199 200 int fd, data_order, must_swab, ret;
200 201 uint8_t e_ident[EI_NIDENT];
... ... @@ -220,9 +221,9 @@ int load_elf(const char *filename, int64_t virt_to_phys_addend)
220 221  
221 222 lseek(fd, 0, SEEK_SET);
222 223 if (e_ident[EI_CLASS] == ELFCLASS64) {
223   - ret = load_elf64(fd, virt_to_phys_addend, must_swab);
  224 + ret = load_elf64(fd, virt_to_phys_addend, must_swab, pentry);
224 225 } else {
225   - ret = load_elf32(fd, virt_to_phys_addend, must_swab);
  226 + ret = load_elf32(fd, virt_to_phys_addend, must_swab, pentry);
226 227 }
227 228  
228 229 close(fd);
... ...
... ... @@ -878,7 +878,7 @@ void slavio_pic_set_irq_cpu(void *opaque, int irq, int level, unsigned int cpu);
878 878 /* loader.c */
879 879 int get_image_size(const char *filename);
880 880 int load_image(const char *filename, uint8_t *addr);
881   -int load_elf(const char *filename, int64_t virt_to_phys_addend);
  881 +int load_elf(const char *filename, int64_t virt_to_phys_addend, uint64_t *pentry);
882 882 int load_aout(const char *filename, uint8_t *addr);
883 883  
884 884 /* slavio_timer.c */
... ...