Commit 9ae0255520fb37d9972bef9bf58d6f342ea7128a
1 parent
a0ae05aa
Add -option-rom option to allow loading of PCI option ROMs, by Anthony Liguori.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2292 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
48 additions
and
1 deletions
hw/pc.c
... | ... | @@ -451,7 +451,7 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, |
451 | 451 | { |
452 | 452 | char buf[1024]; |
453 | 453 | int ret, linux_boot, initrd_size, i; |
454 | - unsigned long bios_offset, vga_bios_offset; | |
454 | + unsigned long bios_offset, vga_bios_offset, option_rom_offset; | |
455 | 455 | int bios_size, isa_bios_size; |
456 | 456 | PCIBus *pci_bus; |
457 | 457 | int piix3_devfn = -1; |
... | ... | @@ -518,6 +518,23 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, |
518 | 518 | cpu_register_physical_memory(0x100000 - isa_bios_size, |
519 | 519 | isa_bios_size, |
520 | 520 | (bios_offset + bios_size - isa_bios_size) | IO_MEM_ROM); |
521 | + | |
522 | + option_rom_offset = 0; | |
523 | + for (i = 0; i < nb_option_roms; i++) { | |
524 | + int offset = bios_offset + bios_size + option_rom_offset; | |
525 | + int size; | |
526 | + | |
527 | + size = load_image(option_rom[i], phys_ram_base + offset); | |
528 | + if ((size + option_rom_offset) > 0x10000) { | |
529 | + fprintf(stderr, "Too many option ROMS\n"); | |
530 | + exit(1); | |
531 | + } | |
532 | + cpu_register_physical_memory(0xd0000 + option_rom_offset, | |
533 | + size, offset | IO_MEM_ROM); | |
534 | + option_rom_offset += size + 2047; | |
535 | + option_rom_offset -= (option_rom_offset % 2048); | |
536 | + } | |
537 | + | |
521 | 538 | /* map all the bios at the top of memory */ |
522 | 539 | cpu_register_physical_memory((uint32_t)(-bios_size), |
523 | 540 | bios_size, bios_offset | IO_MEM_ROM); | ... | ... |
qemu-doc.texi
... | ... | @@ -326,6 +326,10 @@ Use it when installing Windows 2000 to avoid a disk full bug. After |
326 | 326 | Windows 2000 is installed, you no longer need this option (this option |
327 | 327 | slows down the IDE transfers). |
328 | 328 | |
329 | +@item -option-rom file | |
330 | +Load the contents of file as an option ROM. This option is useful to load | |
331 | +things like EtherBoot. | |
332 | + | |
329 | 333 | @end table |
330 | 334 | |
331 | 335 | USB options: | ... | ... |
vl.c
... | ... | @@ -174,6 +174,8 @@ int acpi_enabled = 1; |
174 | 174 | int fd_bootchk = 1; |
175 | 175 | int no_reboot = 0; |
176 | 176 | int daemonize = 0; |
177 | +const char *option_rom[MAX_OPTION_ROMS]; | |
178 | +int nb_option_roms; | |
177 | 179 | |
178 | 180 | /***********************************************************/ |
179 | 181 | /* x86 ISA bus support */ |
... | ... | @@ -6336,6 +6338,7 @@ void help(void) |
6336 | 6338 | #ifndef _WIN32 |
6337 | 6339 | "-daemonize daemonize QEMU after initializing\n" |
6338 | 6340 | #endif |
6341 | + "-option-rom rom load a file, rom, into the option ROM space\n" | |
6339 | 6342 | "\n" |
6340 | 6343 | "During emulation, the following keys are useful:\n" |
6341 | 6344 | "ctrl-alt-f toggle full screen\n" |
... | ... | @@ -6418,6 +6421,7 @@ enum { |
6418 | 6421 | QEMU_OPTION_no_reboot, |
6419 | 6422 | QEMU_OPTION_daemonize, |
6420 | 6423 | QEMU_OPTION_disk, |
6424 | + QEMU_OPTION_option_rom, | |
6421 | 6425 | }; |
6422 | 6426 | |
6423 | 6427 | typedef struct QEMUOption { |
... | ... | @@ -6500,6 +6504,7 @@ const QEMUOption qemu_options[] = { |
6500 | 6504 | { "no-acpi", 0, QEMU_OPTION_no_acpi }, |
6501 | 6505 | { "no-reboot", 0, QEMU_OPTION_no_reboot }, |
6502 | 6506 | { "daemonize", 0, QEMU_OPTION_daemonize }, |
6507 | + { "option-rom", HAS_ARG, QEMU_OPTION_option_rom }, | |
6503 | 6508 | { NULL }, |
6504 | 6509 | }; |
6505 | 6510 | |
... | ... | @@ -7276,6 +7281,14 @@ int main(int argc, char **argv) |
7276 | 7281 | case QEMU_OPTION_daemonize: |
7277 | 7282 | daemonize = 1; |
7278 | 7283 | break; |
7284 | + case QEMU_OPTION_option_rom: | |
7285 | + if (nb_option_roms >= MAX_OPTION_ROMS) { | |
7286 | + fprintf(stderr, "Too many option ROMs\n"); | |
7287 | + exit(1); | |
7288 | + } | |
7289 | + option_rom[nb_option_roms] = optarg; | |
7290 | + nb_option_roms++; | |
7291 | + break; | |
7279 | 7292 | } |
7280 | 7293 | } |
7281 | 7294 | } |
... | ... | @@ -7368,6 +7381,15 @@ int main(int argc, char **argv) |
7368 | 7381 | /* init the memory */ |
7369 | 7382 | phys_ram_size = ram_size + vga_ram_size + bios_size; |
7370 | 7383 | |
7384 | + for (i = 0; i < nb_option_roms; i++) { | |
7385 | + int ret = get_image_size(option_rom[i]); | |
7386 | + if (ret == -1) { | |
7387 | + fprintf(stderr, "Could not load option rom '%s'\n", option_rom[i]); | |
7388 | + exit(1); | |
7389 | + } | |
7390 | + phys_ram_size += ret; | |
7391 | + } | |
7392 | + | |
7371 | 7393 | phys_ram_base = qemu_vmalloc(phys_ram_size); |
7372 | 7394 | if (!phys_ram_base) { |
7373 | 7395 | fprintf(stderr, "Could not allocate physical memory\n"); | ... | ... |
vl.h
... | ... | @@ -154,6 +154,10 @@ extern int usb_enabled; |
154 | 154 | extern int smp_cpus; |
155 | 155 | extern int no_quit; |
156 | 156 | |
157 | +#define MAX_OPTION_ROMS 16 | |
158 | +extern const char *option_rom[MAX_OPTION_ROMS]; | |
159 | +extern int nb_option_roms; | |
160 | + | |
157 | 161 | /* XXX: make it dynamic */ |
158 | 162 | #if defined (TARGET_PPC) || defined (TARGET_SPARC64) |
159 | 163 | #define BIOS_SIZE ((512 + 32) * 1024) | ... | ... |