Commit 293f78bc1b33e4da0fce3d59a7cc8426db8eb04c

Authored by blueswir1
1 parent 5af45186

Remove most uses of phys_ram_base (initial patch by Ian Jackson)

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4442 c046a42c-6fe2-441c-8c8c-71466251a162
hw/sun4m.c
@@ -182,7 +182,7 @@ static void nvram_init(m48t59_t *nvram, uint8_t *macaddr, const char *cmdline, @@ -182,7 +182,7 @@ static void nvram_init(m48t59_t *nvram, uint8_t *macaddr, const char *cmdline,
182 header->kernel_image = cpu_to_be64((uint64_t)KERNEL_LOAD_ADDR); 182 header->kernel_image = cpu_to_be64((uint64_t)KERNEL_LOAD_ADDR);
183 header->kernel_size = cpu_to_be64((uint64_t)kernel_size); 183 header->kernel_size = cpu_to_be64((uint64_t)kernel_size);
184 if (cmdline) { 184 if (cmdline) {
185 - strcpy(phys_ram_base + CMDLINE_ADDR, cmdline); 185 + pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, cmdline);
186 header->cmdline = cpu_to_be64((uint64_t)CMDLINE_ADDR); 186 header->cmdline = cpu_to_be64((uint64_t)CMDLINE_ADDR);
187 header->cmdline_size = cpu_to_be64((uint64_t)strlen(cmdline)); 187 header->cmdline_size = cpu_to_be64((uint64_t)strlen(cmdline));
188 } 188 }
@@ -315,7 +315,8 @@ static void secondary_cpu_reset(void *opaque) @@ -315,7 +315,8 @@ static void secondary_cpu_reset(void *opaque)
315 } 315 }
316 316
317 static unsigned long sun4m_load_kernel(const char *kernel_filename, 317 static unsigned long sun4m_load_kernel(const char *kernel_filename,
318 - const char *initrd_filename) 318 + const char *initrd_filename,
  319 + ram_addr_t RAM_size)
319 { 320 {
320 int linux_boot; 321 int linux_boot;
321 unsigned int i; 322 unsigned int i;
@@ -328,11 +329,12 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename, @@ -328,11 +329,12 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename,
328 kernel_size = load_elf(kernel_filename, -0xf0000000ULL, NULL, NULL, 329 kernel_size = load_elf(kernel_filename, -0xf0000000ULL, NULL, NULL,
329 NULL); 330 NULL);
330 if (kernel_size < 0) 331 if (kernel_size < 0)
331 - kernel_size = load_aout(kernel_filename,  
332 - phys_ram_base + KERNEL_LOAD_ADDR); 332 + kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR,
  333 + RAM_size - KERNEL_LOAD_ADDR);
333 if (kernel_size < 0) 334 if (kernel_size < 0)
334 - kernel_size = load_image(kernel_filename,  
335 - phys_ram_base + KERNEL_LOAD_ADDR); 335 + kernel_size = load_image_targphys(kernel_filename,
  336 + KERNEL_LOAD_ADDR,
  337 + RAM_size - KERNEL_LOAD_ADDR);
336 if (kernel_size < 0) { 338 if (kernel_size < 0) {
337 fprintf(stderr, "qemu: could not load kernel '%s'\n", 339 fprintf(stderr, "qemu: could not load kernel '%s'\n",
338 kernel_filename); 340 kernel_filename);
@@ -342,8 +344,9 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename, @@ -342,8 +344,9 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename,
342 /* load initrd */ 344 /* load initrd */
343 initrd_size = 0; 345 initrd_size = 0;
344 if (initrd_filename) { 346 if (initrd_filename) {
345 - initrd_size = load_image(initrd_filename,  
346 - phys_ram_base + INITRD_LOAD_ADDR); 347 + initrd_size = load_image_targphys(initrd_filename,
  348 + INITRD_LOAD_ADDR,
  349 + RAM_size - INITRD_LOAD_ADDR);
347 if (initrd_size < 0) { 350 if (initrd_size < 0) {
348 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n", 351 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
349 initrd_filename); 352 initrd_filename);
@@ -352,12 +355,9 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename, @@ -352,12 +355,9 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename,
352 } 355 }
353 if (initrd_size > 0) { 356 if (initrd_size > 0) {
354 for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) { 357 for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) {
355 - if (ldl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i)  
356 - == 0x48647253) { // HdrS  
357 - stl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i + 16,  
358 - INITRD_LOAD_ADDR);  
359 - stl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i + 20,  
360 - initrd_size); 358 + if (ldl_phys(KERNEL_LOAD_ADDR + i) == 0x48647253) { // HdrS
  359 + stl_phys(KERNEL_LOAD_ADDR + i + 16, INITRD_LOAD_ADDR);
  360 + stl_phys(KERNEL_LOAD_ADDR + i + 20, initrd_size);
361 break; 361 break;
362 } 362 }
363 } 363 }
@@ -435,7 +435,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size, @@ -435,7 +435,7 @@ static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size,
435 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name); 435 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
436 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL); 436 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
437 if (ret < 0 || ret > PROM_SIZE_MAX) 437 if (ret < 0 || ret > PROM_SIZE_MAX)
438 - ret = load_image(buf, phys_ram_base + prom_offset); 438 + ret = load_image_targphys(buf, prom_offset, PROM_SIZE_MAX);
439 if (ret < 0 || ret > PROM_SIZE_MAX) { 439 if (ret < 0 || ret > PROM_SIZE_MAX) {
440 fprintf(stderr, "qemu: could not load prom '%s'\n", 440 fprintf(stderr, "qemu: could not load prom '%s'\n",
441 buf); 441 buf);
@@ -452,10 +452,12 @@ static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size, @@ -452,10 +452,12 @@ static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size,
452 hwdef->clock_irq); 452 hwdef->clock_irq);
453 453
454 if (hwdef->idreg_base != (target_phys_addr_t)-1) { 454 if (hwdef->idreg_base != (target_phys_addr_t)-1) {
455 - stl_raw(phys_ram_base + prom_offset, 0xfe810103); 455 + static const uint8_t idreg_data[] = { 0xfe, 0x81, 0x01, 0x03 };
456 456
457 - cpu_register_physical_memory(hwdef->idreg_base, sizeof(uint32_t), 457 + cpu_register_physical_memory(hwdef->idreg_base, sizeof(idreg_data),
458 prom_offset | IO_MEM_ROM); 458 prom_offset | IO_MEM_ROM);
  459 + cpu_physical_memory_write_rom(hwdef->idreg_base, idreg_data,
  460 + sizeof(idreg_data));
459 } 461 }
460 462
461 iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version, 463 iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
@@ -534,7 +536,8 @@ static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size, @@ -534,7 +536,8 @@ static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size,
534 if (hwdef->cs_base != (target_phys_addr_t)-1) 536 if (hwdef->cs_base != (target_phys_addr_t)-1)
535 cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl); 537 cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl);
536 538
537 - kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename); 539 + kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
  540 + RAM_size);
538 541
539 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline, 542 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
540 boot_device, RAM_size, kernel_size, graphic_width, 543 boot_device, RAM_size, kernel_size, graphic_width,
@@ -602,7 +605,7 @@ static void sun4c_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size, @@ -602,7 +605,7 @@ static void sun4c_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size,
602 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name); 605 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
603 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL); 606 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
604 if (ret < 0 || ret > PROM_SIZE_MAX) 607 if (ret < 0 || ret > PROM_SIZE_MAX)
605 - ret = load_image(buf, phys_ram_base + prom_offset); 608 + ret = load_image_targphys(buf, prom_offset, PROM_SIZE_MAX);
606 if (ret < 0 || ret > PROM_SIZE_MAX) { 609 if (ret < 0 || ret > PROM_SIZE_MAX) {
607 fprintf(stderr, "qemu: could not load prom '%s'\n", 610 fprintf(stderr, "qemu: could not load prom '%s'\n",
608 buf); 611 buf);
@@ -683,7 +686,8 @@ static void sun4c_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size, @@ -683,7 +686,8 @@ static void sun4c_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size,
683 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i); 686 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
684 } 687 }
685 688
686 - kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename); 689 + kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
  690 + RAM_size);
687 691
688 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline, 692 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
689 boot_device, RAM_size, kernel_size, graphic_width, 693 boot_device, RAM_size, kernel_size, graphic_width,
@@ -1417,7 +1421,7 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, @@ -1417,7 +1421,7 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
1417 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name); 1421 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
1418 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL); 1422 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
1419 if (ret < 0 || ret > PROM_SIZE_MAX) 1423 if (ret < 0 || ret > PROM_SIZE_MAX)
1420 - ret = load_image(buf, phys_ram_base + prom_offset); 1424 + ret = load_image_targphys(buf, prom_offset, PROM_SIZE_MAX);
1421 if (ret < 0 || ret > PROM_SIZE_MAX) { 1425 if (ret < 0 || ret > PROM_SIZE_MAX) {
1422 fprintf(stderr, "qemu: could not load prom '%s'\n", 1426 fprintf(stderr, "qemu: could not load prom '%s'\n",
1423 buf); 1427 buf);
@@ -1486,7 +1490,8 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, @@ -1486,7 +1490,8 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
1486 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i); 1490 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
1487 } 1491 }
1488 1492
1489 - kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename); 1493 + kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
  1494 + RAM_size);
1490 1495
1491 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline, 1496 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
1492 boot_device, RAM_size, kernel_size, graphic_width, 1497 boot_device, RAM_size, kernel_size, graphic_width,
hw/sun4u.c
@@ -105,7 +105,7 @@ static int sun4u_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size, @@ -105,7 +105,7 @@ static int sun4u_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size,
105 header->kernel_image = cpu_to_be64((uint64_t)kernel_image); 105 header->kernel_image = cpu_to_be64((uint64_t)kernel_image);
106 header->kernel_size = cpu_to_be64((uint64_t)kernel_size); 106 header->kernel_size = cpu_to_be64((uint64_t)kernel_size);
107 if (cmdline) { 107 if (cmdline) {
108 - strcpy(phys_ram_base + CMDLINE_ADDR, cmdline); 108 + pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, cmdline);
109 header->cmdline = cpu_to_be64((uint64_t)CMDLINE_ADDR); 109 header->cmdline = cpu_to_be64((uint64_t)CMDLINE_ADDR);
110 header->cmdline_size = cpu_to_be64((uint64_t)strlen(cmdline)); 110 header->cmdline_size = cpu_to_be64((uint64_t)strlen(cmdline));
111 } 111 }
@@ -289,11 +289,12 @@ static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size, @@ -289,11 +289,12 @@ static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size,
289 /* XXX: put correct offset */ 289 /* XXX: put correct offset */
290 kernel_size = load_elf(kernel_filename, 0, NULL, NULL, NULL); 290 kernel_size = load_elf(kernel_filename, 0, NULL, NULL, NULL);
291 if (kernel_size < 0) 291 if (kernel_size < 0)
292 - kernel_size = load_aout(kernel_filename,  
293 - phys_ram_base + KERNEL_LOAD_ADDR); 292 + kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR,
  293 + ram_size - KERNEL_LOAD_ADDR);
294 if (kernel_size < 0) 294 if (kernel_size < 0)
295 - kernel_size = load_image(kernel_filename,  
296 - phys_ram_base + KERNEL_LOAD_ADDR); 295 + kernel_size = load_image_targphys(kernel_filename,
  296 + KERNEL_LOAD_ADDR,
  297 + ram_size - KERNEL_LOAD_ADDR);
297 if (kernel_size < 0) { 298 if (kernel_size < 0) {
298 fprintf(stderr, "qemu: could not load kernel '%s'\n", 299 fprintf(stderr, "qemu: could not load kernel '%s'\n",
299 kernel_filename); 300 kernel_filename);
@@ -302,8 +303,9 @@ static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size, @@ -302,8 +303,9 @@ static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size,
302 303
303 /* load initrd */ 304 /* load initrd */
304 if (initrd_filename) { 305 if (initrd_filename) {
305 - initrd_size = load_image(initrd_filename,  
306 - phys_ram_base + INITRD_LOAD_ADDR); 306 + initrd_size = load_image_targphys(initrd_filename,
  307 + INITRD_LOAD_ADDR,
  308 + ram_size - INITRD_LOAD_ADDR);
307 if (initrd_size < 0) { 309 if (initrd_size < 0) {
308 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n", 310 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
309 initrd_filename); 311 initrd_filename);
@@ -312,12 +314,9 @@ static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size, @@ -312,12 +314,9 @@ static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size,
312 } 314 }
313 if (initrd_size > 0) { 315 if (initrd_size > 0) {
314 for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) { 316 for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) {
315 - if (ldl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i)  
316 - == 0x48647253) { // HdrS  
317 - stl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i + 16,  
318 - INITRD_LOAD_ADDR);  
319 - stl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i + 20,  
320 - initrd_size); 317 + if (ldl_phys(KERNEL_LOAD_ADDR + i) == 0x48647253) { // HdrS
  318 + stl_phys(KERNEL_LOAD_ADDR + i + 16, INITRD_LOAD_ADDR);
  319 + stl_phys(KERNEL_LOAD_ADDR + i + 20, initrd_size);
321 break; 320 break;
322 } 321 }
323 } 322 }
loader.c
@@ -39,6 +39,7 @@ int get_image_size(const char *filename) @@ -39,6 +39,7 @@ int get_image_size(const char *filename)
39 } 39 }
40 40
41 /* return the size or -1 if error */ 41 /* return the size or -1 if error */
  42 +/* deprecated, because caller does not specify buffer size! */
42 int load_image(const char *filename, uint8_t *addr) 43 int load_image(const char *filename, uint8_t *addr)
43 { 44 {
44 int fd, size; 45 int fd, size;
@@ -55,6 +56,84 @@ int load_image(const char *filename, uint8_t *addr) @@ -55,6 +56,84 @@ int load_image(const char *filename, uint8_t *addr)
55 return size; 56 return size;
56 } 57 }
57 58
  59 +/* return the amount read, just like fread. 0 may mean error or eof */
  60 +int fread_targphys(target_phys_addr_t dst_addr, size_t nbytes, FILE *f)
  61 +{
  62 + uint8_t buf[4096];
  63 + target_phys_addr_t dst_begin = dst_addr;
  64 + size_t want, did;
  65 +
  66 + while (nbytes) {
  67 + want = nbytes > sizeof(buf) ? sizeof(buf) : nbytes;
  68 + did = fread(buf, 1, want, f);
  69 + if (did != want) break;
  70 +
  71 + cpu_physical_memory_write_rom(dst_addr, buf, did);
  72 + dst_addr += did;
  73 + nbytes -= did;
  74 + }
  75 + return dst_addr - dst_begin;
  76 +}
  77 +
  78 +/* returns 0 on error, 1 if ok */
  79 +int fread_targphys_ok(target_phys_addr_t dst_addr, size_t nbytes, FILE *f)
  80 +{
  81 + return fread_targphys(dst_addr, nbytes, f) == nbytes;
  82 +}
  83 +
  84 +/* read()-like version */
  85 +int read_targphys(int fd, target_phys_addr_t dst_addr, size_t nbytes)
  86 +{
  87 + uint8_t buf[4096];
  88 + target_phys_addr_t dst_begin = dst_addr;
  89 + size_t want, did;
  90 +
  91 + while (nbytes) {
  92 + want = nbytes > sizeof(buf) ? sizeof(buf) : nbytes;
  93 + did = read(fd, buf, want);
  94 + if (did != want) break;
  95 +
  96 + cpu_physical_memory_write_rom(dst_addr, buf, did);
  97 + dst_addr += did;
  98 + nbytes -= did;
  99 + }
  100 + return dst_addr - dst_begin;
  101 +}
  102 +
  103 +/* return the size or -1 if error */
  104 +int load_image_targphys(const char *filename,
  105 + target_phys_addr_t addr, int max_sz)
  106 +{
  107 + FILE *f;
  108 + size_t got;
  109 +
  110 + f = fopen(filename, "rb");
  111 + if (!f) return -1;
  112 +
  113 + got = fread_targphys(addr, max_sz, f);
  114 + if (ferror(f)) { fclose(f); return -1; }
  115 + fclose(f);
  116 +
  117 + return got;
  118 +}
  119 +
  120 +void pstrcpy_targphys(target_phys_addr_t dest, int buf_size,
  121 + const char *source)
  122 +{
  123 + static const uint8_t nul_byte = 0;
  124 + const char *nulp;
  125 +
  126 + if (buf_size <= 0) return;
  127 + nulp = memchr(source, 0, buf_size);
  128 + if (nulp) {
  129 + cpu_physical_memory_write_rom(dest, (uint8_t *)source,
  130 + (nulp - source) + 1);
  131 + } else {
  132 + cpu_physical_memory_write_rom(dest, (uint8_t *)source, buf_size - 1);
  133 + cpu_physical_memory_write_rom(dest, &nul_byte, 1);
  134 + }
  135 +}
  136 +
58 /* A.OUT loader */ 137 /* A.OUT loader */
59 138
60 struct exec 139 struct exec
@@ -105,7 +184,7 @@ static void bswap_ahdr(struct exec *e) @@ -105,7 +184,7 @@ static void bswap_ahdr(struct exec *e)
105 : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x)))) 184 : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x))))
106 185
107 186
108 -int load_aout(const char *filename, uint8_t *addr) 187 +int load_aout(const char *filename, target_phys_addr_t addr, int max_sz)
109 { 188 {
110 int fd, size, ret; 189 int fd, size, ret;
111 struct exec e; 190 struct exec e;
@@ -126,17 +205,21 @@ int load_aout(const char *filename, uint8_t *addr) @@ -126,17 +205,21 @@ int load_aout(const char *filename, uint8_t *addr)
126 case ZMAGIC: 205 case ZMAGIC:
127 case QMAGIC: 206 case QMAGIC:
128 case OMAGIC: 207 case OMAGIC:
  208 + if (e.a_text + e.a_data > max_sz)
  209 + goto fail;
129 lseek(fd, N_TXTOFF(e), SEEK_SET); 210 lseek(fd, N_TXTOFF(e), SEEK_SET);
130 - size = read(fd, addr, e.a_text + e.a_data); 211 + size = read_targphys(fd, addr, e.a_text + e.a_data);
131 if (size < 0) 212 if (size < 0)
132 goto fail; 213 goto fail;
133 break; 214 break;
134 case NMAGIC: 215 case NMAGIC:
  216 + if (N_DATADDR(e) + e.a_data > max_sz)
  217 + goto fail;
135 lseek(fd, N_TXTOFF(e), SEEK_SET); 218 lseek(fd, N_TXTOFF(e), SEEK_SET);
136 - size = read(fd, addr, e.a_text); 219 + size = read_targphys(fd, addr, e.a_text);
137 if (size < 0) 220 if (size < 0)
138 goto fail; 221 goto fail;
139 - ret = read(fd, addr + N_DATADDR(e), e.a_data); 222 + ret = read_targphys(fd, addr + N_DATADDR(e), e.a_data);
140 if (ret < 0) 223 if (ret < 0)
141 goto fail; 224 goto fail;
142 size += ret; 225 size += ret;
sysemu.h
@@ -151,11 +151,18 @@ extern CharDriverState *parallel_hds[MAX_PARALLEL_PORTS]; @@ -151,11 +151,18 @@ extern CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
151 #ifdef NEED_CPU_H 151 #ifdef NEED_CPU_H
152 /* loader.c */ 152 /* loader.c */
153 int get_image_size(const char *filename); 153 int get_image_size(const char *filename);
154 -int load_image(const char *filename, uint8_t *addr); 154 +int load_image(const char *filename, uint8_t *addr); /* deprecated */
  155 +int load_image_targphys(const char *filename, target_phys_addr_t, int max_sz);
155 int load_elf(const char *filename, int64_t virt_to_phys_addend, 156 int load_elf(const char *filename, int64_t virt_to_phys_addend,
156 uint64_t *pentry, uint64_t *lowaddr, uint64_t *highaddr); 157 uint64_t *pentry, uint64_t *lowaddr, uint64_t *highaddr);
157 -int load_aout(const char *filename, uint8_t *addr); 158 +int load_aout(const char *filename, target_phys_addr_t addr, int max_sz);
158 int load_uboot(const char *filename, target_ulong *ep, int *is_linux); 159 int load_uboot(const char *filename, target_ulong *ep, int *is_linux);
  160 +
  161 +int fread_targphys(target_phys_addr_t dst_addr, size_t nbytes, FILE *f);
  162 +int fread_targphys_ok(target_phys_addr_t dst_addr, size_t nbytes, FILE *f);
  163 +int read_targphys(int fd, target_phys_addr_t dst_addr, size_t nbytes);
  164 +void pstrcpy_targphys(target_phys_addr_t dest, int buf_size,
  165 + const char *source);
159 #endif 166 #endif
160 167
161 #ifdef HAS_AUDIO 168 #ifdef HAS_AUDIO