qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] Add -option-rom option to allow loading of PCI opti


From: Anthony Liguori
Subject: [Qemu-devel] [PATCH] Add -option-rom option to allow loading of PCI option ROMs
Date: Tue, 26 Dec 2006 21:27:31 -0600
User-agent: Thunderbird 1.5.0.8 (X11/20061115)

Howdy,

The following patch adds an -option-rom option to allow loading of PCI option ROMs. This is useful for loading things like etherboot or VMI.

For instance, using an etherboot ROM[1] from http://rom-o-matic.net/, one can use the following command line to PXE boot QEMU:

qemu -hda ~/mydisk.img -option-rom ~/eb-5.4.2-winbond940.zrom

This is also useful for loading a VMI option ROM for experimenting with paravirtualization. Not terribly useful ATM of course.

BTW, I have another patch that would add the etherboot ROMs to the QEMU distribution for all the NICs and then plumb up -boot n to allow PXE booting. Is there any interest in a patch like this? This would increase the QEMU distribution size by 96k.

[1] http://rom-o-matic.net/5.4.2/build.php?version=5.4.2&F=&arch=i386&nic=ns830:winbond940%20--%20[0x1050,0x0940]&ofmt=Binary%20ROM%20Image(.zrom)&A=Get%20ROM

Regards,

Anthony Liguori
diff -r 0a200f17f93e hw/pc.c
--- a/hw/pc.c   Sat Dec 23 16:28:52 2006 -0600
+++ b/hw/pc.c   Sat Dec 23 16:28:54 2006 -0600
@@ -451,7 +451,7 @@ static void pc_init1(int ram_size, int v
 {
     char buf[1024];
     int ret, linux_boot, initrd_size, i;
-    unsigned long bios_offset, vga_bios_offset;
+    unsigned long bios_offset, vga_bios_offset, option_rom_offset;
     int bios_size, isa_bios_size;
     PCIBus *pci_bus;
     int piix3_devfn = -1;
@@ -518,6 +518,23 @@ static void pc_init1(int ram_size, int v
     cpu_register_physical_memory(0x100000 - isa_bios_size, 
                                  isa_bios_size, 
                                  (bios_offset + bios_size - isa_bios_size) | 
IO_MEM_ROM);
+
+    option_rom_offset = 0;
+    for (i = 0; i < nb_option_roms; i++) {
+       int offset = bios_offset + bios_size + option_rom_offset;
+       int size;
+
+       size = load_image(option_rom[i], phys_ram_base + offset);
+       if ((size + option_rom_offset) > 0x10000) {
+           fprintf(stderr, "Too many option ROMS\n");
+           exit(1);
+       }
+       cpu_register_physical_memory(0xd0000 + option_rom_offset,
+                                    size, offset | IO_MEM_ROM);
+       option_rom_offset += size + 2047;
+       option_rom_offset -= (option_rom_offset % 2048);
+    }
+
     /* map all the bios at the top of memory */
     cpu_register_physical_memory((uint32_t)(-bios_size), 
                                  bios_size, bios_offset | IO_MEM_ROM);
diff -r 0a200f17f93e qemu-doc.texi
--- a/qemu-doc.texi     Sat Dec 23 16:28:52 2006 -0600
+++ b/qemu-doc.texi     Sat Dec 23 16:28:54 2006 -0600
@@ -325,6 +325,10 @@ Use it when installing Windows 2000 to a
 Use it when installing Windows 2000 to avoid a disk full bug. After
 Windows 2000 is installed, you no longer need this option (this option
 slows down the IDE transfers).
+
address@hidden -option-rom file
+Load the contents of file as an option ROM.  This option is useful to load
+things like EtherBoot.
 
 @end table
 
diff -r 0a200f17f93e vl.c
--- a/vl.c      Sat Dec 23 16:28:52 2006 -0600
+++ b/vl.c      Sat Dec 23 16:29:15 2006 -0600
@@ -169,6 +169,8 @@ int fd_bootchk = 1;
 int fd_bootchk = 1;
 int no_reboot = 0;
 int daemonize = 0;
+const char *option_rom[MAX_OPTION_ROMS];
+int nb_option_roms;
 
 /***********************************************************/
 /* x86 ISA bus support */
@@ -6213,6 +6215,7 @@ void help(void)
 #ifndef _WIN32
           "-daemonize      daemonize QEMU after initializing\n"
 #endif
+          "-option-rom rom load a file, rom, into the option ROM space\n"
            "\n"
            "During emulation, the following keys are useful:\n"
            "ctrl-alt-f      toggle full screen\n"
@@ -6295,6 +6298,7 @@ enum {
     QEMU_OPTION_no_reboot,
     QEMU_OPTION_daemonize,
     QEMU_OPTION_disk,
+    QEMU_OPTION_option_rom,
 };
 
 typedef struct QEMUOption {
@@ -6377,6 +6381,7 @@ const QEMUOption qemu_options[] = {
     { "no-acpi", 0, QEMU_OPTION_no_acpi },
     { "no-reboot", 0, QEMU_OPTION_no_reboot },
     { "daemonize", 0, QEMU_OPTION_daemonize },
+    { "option-rom", HAS_ARG, QEMU_OPTION_option_rom },
     { NULL },
 };
 
@@ -7130,6 +7135,14 @@ int main(int argc, char **argv)
            case QEMU_OPTION_daemonize:
                daemonize = 1;
                break;
+           case QEMU_OPTION_option_rom:
+               if (nb_option_roms >= MAX_OPTION_ROMS) {
+                   fprintf(stderr, "Too many option ROMs\n");
+                   exit(1);
+               }
+               option_rom[nb_option_roms] = optarg;
+               nb_option_roms++;
+               break;
             }
         }
     }
@@ -7220,6 +7233,15 @@ int main(int argc, char **argv)
 
     /* init the memory */
     phys_ram_size = ram_size + vga_ram_size + bios_size;
+
+    for (i = 0; i < nb_option_roms; i++) {
+       int ret = get_image_size(option_rom[i]);
+       if (ret == -1) {
+           fprintf(stderr, "Could not load option rom '%s'\n", option_rom[i]);
+           exit(1);
+       }
+       phys_ram_size += ret;
+    }
 
     phys_ram_base = qemu_vmalloc(phys_ram_size);
     if (!phys_ram_base) {
diff -r 0a200f17f93e vl.h
--- a/vl.h      Sat Dec 23 16:28:52 2006 -0600
+++ b/vl.h      Sat Dec 23 16:28:54 2006 -0600
@@ -153,6 +153,10 @@ extern int usb_enabled;
 extern int usb_enabled;
 extern int smp_cpus;
 extern int no_quit;
+
+#define MAX_OPTION_ROMS 16
+extern const char *option_rom[MAX_OPTION_ROMS];
+extern int nb_option_roms;
 
 /* XXX: make it dynamic */
 #if defined (TARGET_PPC) || defined (TARGET_SPARC64)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]