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
This commit is contained in:
		
							parent
							
								
									5af451868c
								
							
						
					
					
						commit
						293f78bc1b
					
				
							
								
								
									
										49
									
								
								hw/sun4m.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								hw/sun4m.c
									
									
									
									
									
								
							| @ -182,7 +182,7 @@ static void nvram_init(m48t59_t *nvram, uint8_t *macaddr, const char *cmdline, | ||||
|     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 void secondary_cpu_reset(void *opaque) | ||||
| } | ||||
| 
 | ||||
| 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 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename, | ||||
|         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 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename, | ||||
|         /* 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 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename, | ||||
|         } | ||||
|         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 @@ static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size, | ||||
|     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 @@ static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size, | ||||
|                                        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 @@ static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size, | ||||
|     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 @@ static void sun4c_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size, | ||||
|     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 @@ static void sun4c_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size, | ||||
|         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 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, | ||||
|     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 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, | ||||
|         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, | ||||
|  | ||||
							
								
								
									
										25
									
								
								hw/sun4u.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								hw/sun4u.c
									
									
									
									
									
								
							| @ -105,7 +105,7 @@ static int sun4u_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size, | ||||
|     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 @@ static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size, | ||||
|         /* 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 @@ static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size, | ||||
| 
 | ||||
|         /* 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 @@ static void sun4u_init(ram_addr_t RAM_size, int vga_ram_size, | ||||
|         } | ||||
|         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; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
							
								
								
									
										91
									
								
								loader.c
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								loader.c
									
									
									
									
									
								
							| @ -39,6 +39,7 @@ int get_image_size(const char *filename) | ||||
| } | ||||
| 
 | ||||
| /* 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 @@ int load_image(const char *filename, uint8_t *addr) | ||||
|     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 @@ static void bswap_ahdr(struct exec *e) | ||||
|      : (_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 @@ int load_aout(const char *filename, uint8_t *addr) | ||||
|     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; | ||||
|  | ||||
							
								
								
									
										11
									
								
								sysemu.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								sysemu.h
									
									
									
									
									
								
							| @ -151,11 +151,18 @@ extern CharDriverState *parallel_hds[MAX_PARALLEL_PORTS]; | ||||
| #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 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 blueswir1
						blueswir1