Index: vl.c =================================================================== --- vl.c (revision 6967) +++ vl.c (working copy) @@ -189,6 +189,7 @@ const char *bios_dir = CONFIG_QEMU_SHAREDIR; const char *bios_name = NULL; +const char *nvram_name = NULL; static void *ioport_opaque[MAX_IOPORTS]; static IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS]; static IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS]; @@ -4658,6 +4659,9 @@ case QEMU_OPTION_bios: bios_name = optarg; break; + case QEMU_OPTION_nvram: + nvram_name = optarg; + break; case QEMU_OPTION_S: autostart = 0; break; Index: qemu-options.hx =================================================================== --- qemu-options.hx (revision 6967) +++ qemu-options.hx (working copy) @@ -1265,6 +1265,13 @@ Set the filename for the BIOS. ETEXI +DEF("nvram", HAS_ARG, QEMU_OPTION_nvram, \ + "-nvram file set the filename for the NVRAM\n") +STEXI +@item -nvram @var{file} +Set the filename for the NVRAM. +ETEXI + #ifdef USE_KQEMU DEF("kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu, \ "-kernel-kqemu enable KQEMU full virtualization (default is user mode only)\n") Index: sysemu.h =================================================================== --- sysemu.h (revision 6967) +++ sysemu.h (working copy) @@ -11,6 +11,7 @@ /* vl.c */ extern const char *bios_name; extern const char *bios_dir; +extern const char *nvram_name; extern int vm_running; extern const char *qemu_name; Index: hw/sun4m.c =================================================================== --- hw/sun4m.c (revision 6967) +++ hw/sun4m.c (working copy) @@ -536,32 +536,49 @@ 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, - graphic_height, graphic_depth, hwdef->nvram_machine_id, - "Sun4m"); + if (nvram_name == NULL) { + nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline, + boot_device, RAM_size, kernel_size, graphic_width, + graphic_height, graphic_depth, hwdef->nvram_machine_id, + "Sun4m"); + } else { + uint8_t image[0x1ff0]; + if (get_image_size(nvram_name) == sizeof(image)) { + load_image(nvram_name, image); + + for (i = 0; i < sizeof(image); i++) + m48t59_write(nvram, i, image[i]); + } else { + fprintf(stderr, "qemu: invalid or missing NVRAM image %s\n", + nvram_name); + exit(1); + } + } + if (hwdef->ecc_base) ecc_init(hwdef->ecc_base, slavio_irq[hwdef->ecc_irq], hwdef->ecc_version); - fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2); - 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_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth); - 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); + if (nvram_name == NULL) { + fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2); + 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_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth); + 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, 0); // not used + fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_device[0]); + qemu_register_boot_set(fw_cfg_boot_set, fw_cfg); } - fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR); - fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used - fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_device[0]); - qemu_register_boot_set(fw_cfg_boot_set, fw_cfg); } enum {