diff options
author | blueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-03-08 09:51:29 +0000 |
---|---|---|
committer | blueswir1 <blueswir1@c046a42c-6fe2-441c-8c8c-71466251a162> | 2009-03-08 09:51:29 +0000 |
commit | 513f789f6b187faf1fd533dc6972bbfa021c4381 (patch) | |
tree | cf863f75e7513ed1a29d456a611c4bd2f6c9df8f /hw/sun4u.c | |
parent | 7e12f65678b5d6af9ee0fc30322be3b289c87709 (diff) | |
download | qemu-513f789f6b187faf1fd533dc6972bbfa021c4381.zip qemu-513f789f6b187faf1fd533dc6972bbfa021c4381.tar.gz qemu-513f789f6b187faf1fd533dc6972bbfa021c4381.tar.bz2 |
Use firmware configuration instead of NVRAM (initial patch by Aurelien Jarno)
Use firmware configuration device for boot device, kernel, initrd and
kernel command line parameters on PPC, Sparc32 and Sparc64.
Update OpenBIOS images to r479 which supports the change.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6777 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'hw/sun4u.c')
-rw-r--r-- | hw/sun4u.c | 75 |
1 files changed, 15 insertions, 60 deletions
@@ -89,24 +89,9 @@ void DMA_register_channel (int nchan, { } -static int nvram_boot_set(void *opaque, const char *boot_device) +static int fw_cfg_boot_set(void *opaque, const char *boot_device) { - unsigned int i; - uint8_t image[sizeof(ohwcfg_v3_t)]; - ohwcfg_v3_t *header = (ohwcfg_v3_t *)ℑ - m48t59_t *nvram = (m48t59_t *)opaque; - - for (i = 0; i < sizeof(image); i++) - image[i] = m48t59_read(nvram, i) & 0xff; - - pstrcpy((char *)header->boot_devices, sizeof(header->boot_devices), - boot_device); - header->nboot_devices = strlen(boot_device) & 0xff; - header->crc = cpu_to_be16(OHW_compute_crc(header, 0x00, 0xF8)); - - for (i = 0; i < sizeof(image); i++) - m48t59_write(nvram, i, image[i]); - + fw_cfg_add_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]); return 0; } @@ -124,51 +109,11 @@ static int sun4u_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size, unsigned int i; uint32_t start, end; uint8_t image[0x1ff0]; - ohwcfg_v3_t *header = (ohwcfg_v3_t *)ℑ - struct sparc_arch_cfg *sparc_header; struct OpenBIOS_nvpart_v1 *part_header; memset(image, '\0', sizeof(image)); - // Try to match PPC NVRAM - pstrcpy((char *)header->struct_ident, sizeof(header->struct_ident), - "QEMU_BIOS"); - header->struct_version = cpu_to_be32(3); /* structure v3 */ - - header->nvram_size = cpu_to_be16(NVRAM_size); - header->nvram_arch_ptr = cpu_to_be16(sizeof(ohwcfg_v3_t)); - header->nvram_arch_size = cpu_to_be16(sizeof(struct sparc_arch_cfg)); - pstrcpy((char *)header->arch, sizeof(header->arch), arch); - header->nb_cpus = smp_cpus & 0xff; - header->RAM0_base = 0; - header->RAM0_size = cpu_to_be64((uint64_t)RAM_size); - pstrcpy((char *)header->boot_devices, sizeof(header->boot_devices), - boot_devices); - header->nboot_devices = strlen(boot_devices) & 0xff; - header->kernel_image = cpu_to_be64((uint64_t)kernel_image); - header->kernel_size = cpu_to_be64((uint64_t)kernel_size); - if (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)); - } - header->initrd_image = cpu_to_be64((uint64_t)initrd_image); - header->initrd_size = cpu_to_be64((uint64_t)initrd_size); - header->NVRAM_image = cpu_to_be64((uint64_t)NVRAM_image); - - header->width = cpu_to_be16(width); - header->height = cpu_to_be16(height); - header->depth = cpu_to_be16(depth); - if (nographic) - header->graphic_flags = cpu_to_be16(OHW_GF_NOGRAPHICS); - - header->crc = cpu_to_be16(OHW_compute_crc(header, 0x00, 0xF8)); - - // Architecture specific header - start = sizeof(ohwcfg_v3_t); - sparc_header = (struct sparc_arch_cfg *)&image[start]; - sparc_header->valid = 0; - start += sizeof(struct sparc_arch_cfg); + start = 0; // OpenBIOS nvram variables // Variable partition @@ -200,8 +145,6 @@ static int sun4u_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size, for (i = 0; i < sizeof(image); i++) m48t59_write(nvram, i, image[i]); - qemu_register_boot_set(nvram_boot_set, nvram); - return 0; } @@ -575,6 +518,18 @@ static void sun4uv_init(ram_addr_t RAM_size, int vga_ram_size, fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1); fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size); fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id); + fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, KERNEL_LOAD_ADDR); + fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size); + if (kernel_cmdline) { + fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, CMDLINE_ADDR); + pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, kernel_cmdline); + } else { + fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, 0); + } + fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR); + fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size); + fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_devices[0]); + qemu_register_boot_set(fw_cfg_boot_set, fw_cfg); } enum { |