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,7 +451,7 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, | ||
| 451 | { | 451 | { |
| 452 | char buf[1024]; | 452 | char buf[1024]; |
| 453 | int ret, linux_boot, initrd_size, i; | 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 | int bios_size, isa_bios_size; | 455 | int bios_size, isa_bios_size; |
| 456 | PCIBus *pci_bus; | 456 | PCIBus *pci_bus; |
| 457 | int piix3_devfn = -1; | 457 | int piix3_devfn = -1; |
| @@ -518,6 +518,23 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, | @@ -518,6 +518,23 @@ static void pc_init1(int ram_size, int vga_ram_size, int boot_device, | ||
| 518 | cpu_register_physical_memory(0x100000 - isa_bios_size, | 518 | cpu_register_physical_memory(0x100000 - isa_bios_size, |
| 519 | isa_bios_size, | 519 | isa_bios_size, |
| 520 | (bios_offset + bios_size - isa_bios_size) | IO_MEM_ROM); | 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 | /* map all the bios at the top of memory */ | 538 | /* map all the bios at the top of memory */ |
| 522 | cpu_register_physical_memory((uint32_t)(-bios_size), | 539 | cpu_register_physical_memory((uint32_t)(-bios_size), |
| 523 | bios_size, bios_offset | IO_MEM_ROM); | 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,6 +326,10 @@ Use it when installing Windows 2000 to avoid a disk full bug. After | ||
| 326 | Windows 2000 is installed, you no longer need this option (this option | 326 | Windows 2000 is installed, you no longer need this option (this option |
| 327 | slows down the IDE transfers). | 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 | @end table | 333 | @end table |
| 330 | 334 | ||
| 331 | USB options: | 335 | USB options: |
vl.c
| @@ -174,6 +174,8 @@ int acpi_enabled = 1; | @@ -174,6 +174,8 @@ int acpi_enabled = 1; | ||
| 174 | int fd_bootchk = 1; | 174 | int fd_bootchk = 1; |
| 175 | int no_reboot = 0; | 175 | int no_reboot = 0; |
| 176 | int daemonize = 0; | 176 | int daemonize = 0; |
| 177 | +const char *option_rom[MAX_OPTION_ROMS]; | ||
| 178 | +int nb_option_roms; | ||
| 177 | 179 | ||
| 178 | /***********************************************************/ | 180 | /***********************************************************/ |
| 179 | /* x86 ISA bus support */ | 181 | /* x86 ISA bus support */ |
| @@ -6336,6 +6338,7 @@ void help(void) | @@ -6336,6 +6338,7 @@ void help(void) | ||
| 6336 | #ifndef _WIN32 | 6338 | #ifndef _WIN32 |
| 6337 | "-daemonize daemonize QEMU after initializing\n" | 6339 | "-daemonize daemonize QEMU after initializing\n" |
| 6338 | #endif | 6340 | #endif |
| 6341 | + "-option-rom rom load a file, rom, into the option ROM space\n" | ||
| 6339 | "\n" | 6342 | "\n" |
| 6340 | "During emulation, the following keys are useful:\n" | 6343 | "During emulation, the following keys are useful:\n" |
| 6341 | "ctrl-alt-f toggle full screen\n" | 6344 | "ctrl-alt-f toggle full screen\n" |
| @@ -6418,6 +6421,7 @@ enum { | @@ -6418,6 +6421,7 @@ enum { | ||
| 6418 | QEMU_OPTION_no_reboot, | 6421 | QEMU_OPTION_no_reboot, |
| 6419 | QEMU_OPTION_daemonize, | 6422 | QEMU_OPTION_daemonize, |
| 6420 | QEMU_OPTION_disk, | 6423 | QEMU_OPTION_disk, |
| 6424 | + QEMU_OPTION_option_rom, | ||
| 6421 | }; | 6425 | }; |
| 6422 | 6426 | ||
| 6423 | typedef struct QEMUOption { | 6427 | typedef struct QEMUOption { |
| @@ -6500,6 +6504,7 @@ const QEMUOption qemu_options[] = { | @@ -6500,6 +6504,7 @@ const QEMUOption qemu_options[] = { | ||
| 6500 | { "no-acpi", 0, QEMU_OPTION_no_acpi }, | 6504 | { "no-acpi", 0, QEMU_OPTION_no_acpi }, |
| 6501 | { "no-reboot", 0, QEMU_OPTION_no_reboot }, | 6505 | { "no-reboot", 0, QEMU_OPTION_no_reboot }, |
| 6502 | { "daemonize", 0, QEMU_OPTION_daemonize }, | 6506 | { "daemonize", 0, QEMU_OPTION_daemonize }, |
| 6507 | + { "option-rom", HAS_ARG, QEMU_OPTION_option_rom }, | ||
| 6503 | { NULL }, | 6508 | { NULL }, |
| 6504 | }; | 6509 | }; |
| 6505 | 6510 | ||
| @@ -7276,6 +7281,14 @@ int main(int argc, char **argv) | @@ -7276,6 +7281,14 @@ int main(int argc, char **argv) | ||
| 7276 | case QEMU_OPTION_daemonize: | 7281 | case QEMU_OPTION_daemonize: |
| 7277 | daemonize = 1; | 7282 | daemonize = 1; |
| 7278 | break; | 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,6 +7381,15 @@ int main(int argc, char **argv) | ||
| 7368 | /* init the memory */ | 7381 | /* init the memory */ |
| 7369 | phys_ram_size = ram_size + vga_ram_size + bios_size; | 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 | phys_ram_base = qemu_vmalloc(phys_ram_size); | 7393 | phys_ram_base = qemu_vmalloc(phys_ram_size); |
| 7372 | if (!phys_ram_base) { | 7394 | if (!phys_ram_base) { |
| 7373 | fprintf(stderr, "Could not allocate physical memory\n"); | 7395 | fprintf(stderr, "Could not allocate physical memory\n"); |
vl.h
| @@ -154,6 +154,10 @@ extern int usb_enabled; | @@ -154,6 +154,10 @@ extern int usb_enabled; | ||
| 154 | extern int smp_cpus; | 154 | extern int smp_cpus; |
| 155 | extern int no_quit; | 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 | /* XXX: make it dynamic */ | 161 | /* XXX: make it dynamic */ |
| 158 | #if defined (TARGET_PPC) || defined (TARGET_SPARC64) | 162 | #if defined (TARGET_PPC) || defined (TARGET_SPARC64) |
| 159 | #define BIOS_SIZE ((512 + 32) * 1024) | 163 | #define BIOS_SIZE ((512 + 32) * 1024) |