From: Anthony Liguori <aliguori@cs.utexas.edu>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH] Add -option-rom option to allow loading of PCI option ROMs
Date: Tue, 26 Dec 2006 21:27:31 -0600 [thread overview]
Message-ID: <4591E823.9060103@cs.utexas.edu> (raw)
[-- Attachment #1: Type: text/plain, Size: 916 bytes --]
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
[-- Attachment #2: qemu-option-rom.diff --]
[-- Type: text/x-patch, Size: 4295 bytes --]
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).
+
+@item -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)
next reply other threads:[~2006-12-27 3:27 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-27 3:27 Anthony Liguori [this message]
2006-12-27 13:30 ` [Qemu-devel] [PATCH] Add -option-rom option to allow loading of PCI option ROMs Fabrice Bellard
2006-12-27 17:12 ` Anthony Liguori
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4591E823.9060103@cs.utexas.edu \
--to=aliguori@cs.utexas.edu \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).