From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JvbjB-0005YS-Tl for qemu-devel@nongnu.org; Mon, 12 May 2008 13:22:21 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JvbjA-0005YC-6V for qemu-devel@nongnu.org; Mon, 12 May 2008 13:22:20 -0400 Received: from [199.232.76.173] (port=58661 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JvbjA-0005Y6-0q for qemu-devel@nongnu.org; Mon, 12 May 2008 13:22:20 -0400 Received: from savannah.gnu.org ([199.232.41.3]:57304 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1Jvbj9-0001FX-4U for qemu-devel@nongnu.org; Mon, 12 May 2008 13:22:19 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1Jvbj7-0000N2-G5 for qemu-devel@nongnu.org; Mon, 12 May 2008 17:22:17 +0000 Received: from blueswir1 by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1Jvbj5-0000Mo-H2 for qemu-devel@nongnu.org; Mon, 12 May 2008 17:22:16 +0000 MIME-Version: 1.0 Errors-To: blueswir1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Blue Swirl Message-Id: Date: Mon, 12 May 2008 17:22:15 +0000 Subject: [Qemu-devel] [4442] Remove most uses of phys_ram_base (initial patch by Ian Jackson) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 4442 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4442 Author: blueswir1 Date: 2008-05-12 17:22:13 +0000 (Mon, 12 May 2008) Log Message: ----------- Remove most uses of phys_ram_base (initial patch by Ian Jackson) Modified Paths: -------------- trunk/hw/sun4m.c trunk/hw/sun4u.c trunk/loader.c trunk/sysemu.h Modified: trunk/hw/sun4m.c =================================================================== --- trunk/hw/sun4m.c 2008-05-12 16:47:36 UTC (rev 4441) +++ trunk/hw/sun4m.c 2008-05-12 17:22:13 UTC (rev 4442) @@ -182,7 +182,7 @@ header->kernel_image = cpu_to_be64((uint64_t)KERNEL_LOAD_ADDR); header->kernel_size = cpu_to_be64((uint64_t)kernel_size); if (cmdline) { - strcpy(phys_ram_base + CMDLINE_ADDR, cmdline); + pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, cmdline); header->cmdline = cpu_to_be64((uint64_t)CMDLINE_ADDR); header->cmdline_size = cpu_to_be64((uint64_t)strlen(cmdline)); } @@ -315,7 +315,8 @@ } static unsigned long sun4m_load_kernel(const char *kernel_filename, - const char *initrd_filename) + const char *initrd_filename, + ram_addr_t RAM_size) { int linux_boot; unsigned int i; @@ -328,11 +329,12 @@ kernel_size = load_elf(kernel_filename, -0xf0000000ULL, NULL, NULL, NULL); if (kernel_size < 0) - kernel_size = load_aout(kernel_filename, - phys_ram_base + KERNEL_LOAD_ADDR); + kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR, + RAM_size - KERNEL_LOAD_ADDR); if (kernel_size < 0) - kernel_size = load_image(kernel_filename, - phys_ram_base + KERNEL_LOAD_ADDR); + kernel_size = load_image_targphys(kernel_filename, + KERNEL_LOAD_ADDR, + RAM_size - KERNEL_LOAD_ADDR); if (kernel_size < 0) { fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename); @@ -342,8 +344,9 @@ /* load initrd */ initrd_size = 0; if (initrd_filename) { - initrd_size = load_image(initrd_filename, - phys_ram_base + INITRD_LOAD_ADDR); + initrd_size = load_image_targphys(initrd_filename, + INITRD_LOAD_ADDR, + RAM_size - INITRD_LOAD_ADDR); if (initrd_size < 0) { fprintf(stderr, "qemu: could not load initial ram disk '%s'\n", initrd_filename); @@ -352,12 +355,9 @@ } if (initrd_size > 0) { for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) { - if (ldl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i) - == 0x48647253) { // HdrS - stl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i + 16, - INITRD_LOAD_ADDR); - stl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i + 20, - initrd_size); + if (ldl_phys(KERNEL_LOAD_ADDR + i) == 0x48647253) { // HdrS + stl_phys(KERNEL_LOAD_ADDR + i + 16, INITRD_LOAD_ADDR); + stl_phys(KERNEL_LOAD_ADDR + i + 20, initrd_size); break; } } @@ -435,7 +435,7 @@ snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name); ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL); if (ret < 0 || ret > PROM_SIZE_MAX) - ret = load_image(buf, phys_ram_base + prom_offset); + ret = load_image_targphys(buf, prom_offset, PROM_SIZE_MAX); if (ret < 0 || ret > PROM_SIZE_MAX) { fprintf(stderr, "qemu: could not load prom '%s'\n", buf); @@ -452,10 +452,12 @@ hwdef->clock_irq); if (hwdef->idreg_base != (target_phys_addr_t)-1) { - stl_raw(phys_ram_base + prom_offset, 0xfe810103); + static const uint8_t idreg_data[] = { 0xfe, 0x81, 0x01, 0x03 }; - cpu_register_physical_memory(hwdef->idreg_base, sizeof(uint32_t), + cpu_register_physical_memory(hwdef->idreg_base, sizeof(idreg_data), prom_offset | IO_MEM_ROM); + cpu_physical_memory_write_rom(hwdef->idreg_base, idreg_data, + sizeof(idreg_data)); } iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version, @@ -534,7 +536,8 @@ if (hwdef->cs_base != (target_phys_addr_t)-1) cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl); - kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename); + kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename, + RAM_size); nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline, boot_device, RAM_size, kernel_size, graphic_width, @@ -602,7 +605,7 @@ snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name); ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL); if (ret < 0 || ret > PROM_SIZE_MAX) - ret = load_image(buf, phys_ram_base + prom_offset); + ret = load_image_targphys(buf, prom_offset, PROM_SIZE_MAX); if (ret < 0 || ret > PROM_SIZE_MAX) { fprintf(stderr, "qemu: could not load prom '%s'\n", buf); @@ -683,7 +686,8 @@ esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i); } - kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename); + kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename, + RAM_size); nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline, boot_device, RAM_size, kernel_size, graphic_width, @@ -1417,7 +1421,7 @@ snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name); ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL); if (ret < 0 || ret > PROM_SIZE_MAX) - ret = load_image(buf, phys_ram_base + prom_offset); + ret = load_image_targphys(buf, prom_offset, PROM_SIZE_MAX); if (ret < 0 || ret > PROM_SIZE_MAX) { fprintf(stderr, "qemu: could not load prom '%s'\n", buf); @@ -1486,7 +1490,8 @@ esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i); } - kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename); + kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename, + RAM_size); nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline, boot_device, RAM_size, kernel_size, graphic_width, Modified: trunk/hw/sun4u.c =================================================================== --- trunk/hw/sun4u.c 2008-05-12 16:47:36 UTC (rev 4441) +++ trunk/hw/sun4u.c 2008-05-12 17:22:13 UTC (rev 4442) @@ -105,7 +105,7 @@ header->kernel_image = cpu_to_be64((uint64_t)kernel_image); header->kernel_size = cpu_to_be64((uint64_t)kernel_size); if (cmdline) { - strcpy(phys_ram_base + CMDLINE_ADDR, cmdline); + pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, cmdline); header->cmdline = cpu_to_be64((uint64_t)CMDLINE_ADDR); header->cmdline_size = cpu_to_be64((uint64_t)strlen(cmdline)); } @@ -289,11 +289,12 @@ /* XXX: put correct offset */ kernel_size = load_elf(kernel_filename, 0, NULL, NULL, NULL); if (kernel_size < 0) - kernel_size = load_aout(kernel_filename, - phys_ram_base + KERNEL_LOAD_ADDR); + kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR, + ram_size - KERNEL_LOAD_ADDR); if (kernel_size < 0) - kernel_size = load_image(kernel_filename, - phys_ram_base + KERNEL_LOAD_ADDR); + kernel_size = load_image_targphys(kernel_filename, + KERNEL_LOAD_ADDR, + ram_size - KERNEL_LOAD_ADDR); if (kernel_size < 0) { fprintf(stderr, "qemu: could not load kernel '%s'\n", kernel_filename); @@ -302,8 +303,9 @@ /* load initrd */ if (initrd_filename) { - initrd_size = load_image(initrd_filename, - phys_ram_base + INITRD_LOAD_ADDR); + initrd_size = load_image_targphys(initrd_filename, + INITRD_LOAD_ADDR, + ram_size - INITRD_LOAD_ADDR); if (initrd_size < 0) { fprintf(stderr, "qemu: could not load initial ram disk '%s'\n", initrd_filename); @@ -312,12 +314,9 @@ } if (initrd_size > 0) { for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) { - if (ldl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i) - == 0x48647253) { // HdrS - stl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i + 16, - INITRD_LOAD_ADDR); - stl_raw(phys_ram_base + KERNEL_LOAD_ADDR + i + 20, - initrd_size); + if (ldl_phys(KERNEL_LOAD_ADDR + i) == 0x48647253) { // HdrS + stl_phys(KERNEL_LOAD_ADDR + i + 16, INITRD_LOAD_ADDR); + stl_phys(KERNEL_LOAD_ADDR + i + 20, initrd_size); break; } } Modified: trunk/loader.c =================================================================== --- trunk/loader.c 2008-05-12 16:47:36 UTC (rev 4441) +++ trunk/loader.c 2008-05-12 17:22:13 UTC (rev 4442) @@ -39,6 +39,7 @@ } /* return the size or -1 if error */ +/* deprecated, because caller does not specify buffer size! */ int load_image(const char *filename, uint8_t *addr) { int fd, size; @@ -55,6 +56,84 @@ return size; } +/* return the amount read, just like fread. 0 may mean error or eof */ +int fread_targphys(target_phys_addr_t dst_addr, size_t nbytes, FILE *f) +{ + uint8_t buf[4096]; + target_phys_addr_t dst_begin = dst_addr; + size_t want, did; + + while (nbytes) { + want = nbytes > sizeof(buf) ? sizeof(buf) : nbytes; + did = fread(buf, 1, want, f); + if (did != want) break; + + cpu_physical_memory_write_rom(dst_addr, buf, did); + dst_addr += did; + nbytes -= did; + } + return dst_addr - dst_begin; +} + +/* returns 0 on error, 1 if ok */ +int fread_targphys_ok(target_phys_addr_t dst_addr, size_t nbytes, FILE *f) +{ + return fread_targphys(dst_addr, nbytes, f) == nbytes; +} + +/* read()-like version */ +int read_targphys(int fd, target_phys_addr_t dst_addr, size_t nbytes) +{ + uint8_t buf[4096]; + target_phys_addr_t dst_begin = dst_addr; + size_t want, did; + + while (nbytes) { + want = nbytes > sizeof(buf) ? sizeof(buf) : nbytes; + did = read(fd, buf, want); + if (did != want) break; + + cpu_physical_memory_write_rom(dst_addr, buf, did); + dst_addr += did; + nbytes -= did; + } + return dst_addr - dst_begin; +} + +/* return the size or -1 if error */ +int load_image_targphys(const char *filename, + target_phys_addr_t addr, int max_sz) +{ + FILE *f; + size_t got; + + f = fopen(filename, "rb"); + if (!f) return -1; + + got = fread_targphys(addr, max_sz, f); + if (ferror(f)) { fclose(f); return -1; } + fclose(f); + + return got; +} + +void pstrcpy_targphys(target_phys_addr_t dest, int buf_size, + const char *source) +{ + static const uint8_t nul_byte = 0; + const char *nulp; + + if (buf_size <= 0) return; + nulp = memchr(source, 0, buf_size); + if (nulp) { + cpu_physical_memory_write_rom(dest, (uint8_t *)source, + (nulp - source) + 1); + } else { + cpu_physical_memory_write_rom(dest, (uint8_t *)source, buf_size - 1); + cpu_physical_memory_write_rom(dest, &nul_byte, 1); + } +} + /* A.OUT loader */ struct exec @@ -105,7 +184,7 @@ : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x)))) -int load_aout(const char *filename, uint8_t *addr) +int load_aout(const char *filename, target_phys_addr_t addr, int max_sz) { int fd, size, ret; struct exec e; @@ -126,17 +205,21 @@ case ZMAGIC: case QMAGIC: case OMAGIC: + if (e.a_text + e.a_data > max_sz) + goto fail; lseek(fd, N_TXTOFF(e), SEEK_SET); - size = read(fd, addr, e.a_text + e.a_data); + size = read_targphys(fd, addr, e.a_text + e.a_data); if (size < 0) goto fail; break; case NMAGIC: + if (N_DATADDR(e) + e.a_data > max_sz) + goto fail; lseek(fd, N_TXTOFF(e), SEEK_SET); - size = read(fd, addr, e.a_text); + size = read_targphys(fd, addr, e.a_text); if (size < 0) goto fail; - ret = read(fd, addr + N_DATADDR(e), e.a_data); + ret = read_targphys(fd, addr + N_DATADDR(e), e.a_data); if (ret < 0) goto fail; size += ret; Modified: trunk/sysemu.h =================================================================== --- trunk/sysemu.h 2008-05-12 16:47:36 UTC (rev 4441) +++ trunk/sysemu.h 2008-05-12 17:22:13 UTC (rev 4442) @@ -151,11 +151,18 @@ #ifdef NEED_CPU_H /* loader.c */ int get_image_size(const char *filename); -int load_image(const char *filename, uint8_t *addr); +int load_image(const char *filename, uint8_t *addr); /* deprecated */ +int load_image_targphys(const char *filename, target_phys_addr_t, int max_sz); int load_elf(const char *filename, int64_t virt_to_phys_addend, uint64_t *pentry, uint64_t *lowaddr, uint64_t *highaddr); -int load_aout(const char *filename, uint8_t *addr); +int load_aout(const char *filename, target_phys_addr_t addr, int max_sz); int load_uboot(const char *filename, target_ulong *ep, int *is_linux); + +int fread_targphys(target_phys_addr_t dst_addr, size_t nbytes, FILE *f); +int fread_targphys_ok(target_phys_addr_t dst_addr, size_t nbytes, FILE *f); +int read_targphys(int fd, target_phys_addr_t dst_addr, size_t nbytes); +void pstrcpy_targphys(target_phys_addr_t dest, int buf_size, + const char *source); #endif #ifdef HAS_AUDIO