All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] Where's gpxe-eepro100-80862449.rom ?
@ 2010-10-12 12:41 Markus Armbruster
  2010-10-12 16:18 ` [Qemu-devel] " Stefan Weil
  0 siblings, 1 reply; 43+ messages in thread
From: Markus Armbruster @ 2010-10-12 12:41 UTC (permalink / raw)
  To: Stefan Weil; +Cc: qemu-devel

Commit db667a12 added a reference to ROM file
gpxe-eepro100-80862449.rom, but no such file.  Intentional?

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] Re: Where's gpxe-eepro100-80862449.rom ?
  2010-10-12 12:41 [Qemu-devel] Where's gpxe-eepro100-80862449.rom ? Markus Armbruster
@ 2010-10-12 16:18 ` Stefan Weil
  2010-10-13  7:13   ` Markus Armbruster
  0 siblings, 1 reply; 43+ messages in thread
From: Stefan Weil @ 2010-10-12 16:18 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1143 bytes --]

Am 12.10.2010 14:41, schrieb Markus Armbruster:
> Commit db667a12 added a reference to ROM file
> gpxe-eepro100-80862449.rom, but no such file. Intentional?

Yes. See 
http://lists.nongnu.org/archive/html/qemu-devel/2010-05/msg00418.html

Citation from my former mail:

    Yes, it is missing. I did not add it for several reasons:

    * The new variant i82801 (which needs the missing ROM) is currently
    not available
    via model=i82801 (it can be selected by experts using other methods).

    * Experts can get the missing ROM from ROM-o-matic.

    * All three ROMs differ only in one or two bytes (device id). That's
    a waste
    of binary space (56832 bytes!). Therefore I plan to remove all but
    the first
    ROM file. The missing ones can be created by make or patched on the
    fly by
    QEMU during load. Maybe it is also possible to create ROM files
    which support
    more than one vendor/device entry - that would be the best solution.


There is still nothing new regarding these last points
because I did not spend any time on them.

Do you think there is urgent need for a gpxe-eepro100-80862449.rom binary?


[-- Attachment #2: Type: text/html, Size: 1800 bytes --]

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] Re: Where's gpxe-eepro100-80862449.rom ?
  2010-10-12 16:18 ` [Qemu-devel] " Stefan Weil
@ 2010-10-13  7:13   ` Markus Armbruster
  2010-10-15 20:51     ` [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM Stefan Weil
                       ` (2 more replies)
  0 siblings, 3 replies; 43+ messages in thread
From: Markus Armbruster @ 2010-10-13  7:13 UTC (permalink / raw)
  To: Stefan Weil; +Cc: qemu-devel

Stefan Weil <weil@mail.berlios.de> writes:

> Am 12.10.2010 14:41, schrieb Markus Armbruster:
>> Commit db667a12 added a reference to ROM file
>> gpxe-eepro100-80862449.rom, but no such file. Intentional?
>
> Yes. See
> http://lists.nongnu.org/archive/html/qemu-devel/2010-05/msg00418.html
>
> Citation from my former mail:
>
>    Yes, it is missing. I did not add it for several reasons:
>
>    * The new variant i82801 (which needs the missing ROM) is currently
>    not available
>    via model=i82801 (it can be selected by experts using other methods).

It's available via -device i82801.  -net nic,model= is obsolescent.

>    * Experts can get the missing ROM from ROM-o-matic.
>
>    * All three ROMs differ only in one or two bytes (device id). That's
>    a waste
>    of binary space (56832 bytes!). Therefore I plan to remove all but
>    the first
>    ROM file. The missing ones can be created by make or patched on the
>    fly by
>    QEMU during load. Maybe it is also possible to create ROM files
>    which support
>    more than one vendor/device entry - that would be the best solution.

No objections to creating by make or on load, but I'd be just fine with
the duplicated ROMs.  Disk space waste in the order of 100KiB is lost in
the noise nowadays.  My qemu/.git is >100MiB, and my build tree for all
targets ~1.5GiB.

> There is still nothing new regarding these last points
> because I did not spend any time on them.
>
> Do you think there is urgent need for a gpxe-eepro100-80862449.rom binary?

Well, "-device i82801" complains because it misses this binary.  Do we
want to ship that way?

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-13  7:13   ` Markus Armbruster
@ 2010-10-15 20:51     ` Stefan Weil
  2010-10-15 21:05       ` Anthony Liguori
  2010-10-18 10:04       ` Gerd Hoffmann
  2010-10-15 20:51     ` [Qemu-devel] [PATCH 2/2] eepro100: Use a single rom file for all i825xx devices Stefan Weil
  2010-10-15 21:03     ` [Qemu-devel] Re: Where's gpxe-eepro100-80862449.rom ? Stefan Weil
  2 siblings, 2 replies; 43+ messages in thread
From: Stefan Weil @ 2010-10-15 20:51 UTC (permalink / raw)
  To: QEMU Developers; +Cc: Markus Armbruster, Michael S. Tsirkin

PCI device with different device ids sometimes share
the same rom code. Only the device id and the checksum
differ in a boot rom for such devices.

The i825xx ethernet controller family is a typical example
which is implemented in hw/eepro100.c. It uses at least
3 different device ids, so normally 3 boot roms would be needed.

By automatically patching the device id (and the checksum)
in qemu, all emulated family members can share the same
boot rom.

Cc: Markus Armbruster <armbru@redhat.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Stefan Weil <weil@mail.berlios.de>
---
 hw/pci.c |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 53 insertions(+), 0 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index 1280d4d..c1f8218 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1797,6 +1797,57 @@ static void pci_map_option_rom(PCIDevice *pdev, int region_num, pcibus_t addr, p
     cpu_register_physical_memory(addr, size, pdev->rom_offset);
 }
 
+/* Patch the PCI device id in a PCI rom image if necessary.
+   This is needed for an option rom which is used for more than one device. */
+static void pci_patch_device_id(PCIDevice *pdev, uint8_t *ptr, int size)
+{
+    uint16_t vendor_id;
+    uint16_t device_id;
+    uint16_t rom_vendor_id;
+    uint16_t rom_device_id;
+    uint16_t rom_magic;
+    uint16_t pcir_offset;
+
+    /* Words in rom data are little endian (like in PCI configuration),
+       so they can be read / written with pci_get_word / pci_set_word. */
+
+    /* Only a valid rom will be patched. */
+    rom_magic = pci_get_word(ptr);
+    if (rom_magic != 0xaa55) {
+        PCI_DPRINTF("Bad ROM magic %04x\n", rom_magic);
+        return;
+    }
+    pcir_offset = pci_get_word(ptr + 0x18);
+    if (pcir_offset + 8 >= size || memcmp(ptr + pcir_offset, "PCIR", 4)) {
+        PCI_DPRINTF("Bad PCIR offset 0x%x or signature\n", pcir_offset);
+        return;
+    }
+
+    vendor_id = pci_get_word(pdev->config + PCI_VENDOR_ID);
+    device_id = pci_get_word(pdev->config + PCI_DEVICE_ID);
+    rom_vendor_id = pci_get_word(ptr + pcir_offset + 4);
+    rom_device_id = pci_get_word(ptr + pcir_offset + 6);
+
+    /* Don't patch a rom with wrong vendor id (might be changed if needed). */
+    if (vendor_id != rom_vendor_id) {
+        return;
+    }
+
+    PCI_DPRINTF("ROM id %04x%04x / PCI id %04x%04x\n",
+                vendor_id, device_id, rom_vendor_id, rom_device_id);
+
+    if (device_id != rom_device_id) {
+        /* Patch device id and checksum (at offset 6 for etherboot roms). */
+        uint8_t checksum;
+        checksum = ptr[6];
+        checksum += (uint8_t)rom_device_id + (uint8_t)(rom_device_id >> 8);
+        checksum -= (uint8_t)device_id + (uint8_t)(device_id >> 8);
+        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
+        ptr[6] = checksum;
+        pci_set_word(ptr + pcir_offset + 6, device_id);
+    }
+}
+
 /* Add an option rom for the device */
 static int pci_add_option_rom(PCIDevice *pdev)
 {
@@ -1849,6 +1900,8 @@ static int pci_add_option_rom(PCIDevice *pdev)
     load_image(path, ptr);
     qemu_free(path);
 
+    pci_patch_device_id(pdev, ptr, size);
+
     pci_register_bar(pdev, PCI_ROM_SLOT, size,
                      0, pci_map_option_rom);
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [Qemu-devel] [PATCH 2/2] eepro100: Use a single rom file for all i825xx devices
  2010-10-13  7:13   ` Markus Armbruster
  2010-10-15 20:51     ` [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM Stefan Weil
@ 2010-10-15 20:51     ` Stefan Weil
  2010-11-22  6:29       ` [Qemu-devel] " Michael S. Tsirkin
  2010-10-15 21:03     ` [Qemu-devel] Re: Where's gpxe-eepro100-80862449.rom ? Stefan Weil
  2 siblings, 1 reply; 43+ messages in thread
From: Stefan Weil @ 2010-10-15 20:51 UTC (permalink / raw)
  To: QEMU Developers; +Cc: Markus Armbruster, Michael S. Tsirkin

Patching the rom data during load (in qemu) now
also supports i82801 (which had no rom file).

We only need a single rom file for the whole device family,
so remove the second one which is no longer needed.

Cc: Markus Armbruster <armbru@redhat.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Stefan Weil <weil@mail.berlios.de>
---
 Makefile                           |    1 -
 hw/eepro100.c                      |   14 +++-----------
 pc-bios/README                     |    2 +-
 pc-bios/gpxe-eepro100-80861229.rom |  Bin 56832 -> 0 bytes
 4 files changed, 4 insertions(+), 13 deletions(-)
 delete mode 100644 pc-bios/gpxe-eepro100-80861229.rom

diff --git a/Makefile b/Makefile
index 252c817..b5f6ba4 100644
--- a/Makefile
+++ b/Makefile
@@ -178,7 +178,6 @@ ifdef INSTALL_BLOBS
 BLOBS=bios.bin vgabios.bin vgabios-cirrus.bin ppc_rom.bin \
 openbios-sparc32 openbios-sparc64 openbios-ppc \
 gpxe-eepro100-80861209.rom \
-gpxe-eepro100-80861229.rom \
 pxe-e1000.bin \
 pxe-ne2k_pci.bin pxe-pcnet.bin \
 pxe-rtl8139.bin pxe-virtio.bin \
diff --git a/hw/eepro100.c b/hw/eepro100.c
index 218472d..5835b5a 100644
--- a/hw/eepro100.c
+++ b/hw/eepro100.c
@@ -2048,17 +2048,9 @@ static void eepro100_register_devices(void)
     size_t i;
     for (i = 0; i < ARRAY_SIZE(e100_devices); i++) {
         PCIDeviceInfo *pci_dev = &e100_devices[i].pci;
-        switch (e100_devices[i].device_id) {
-            case PCI_DEVICE_ID_INTEL_82551IT:
-                pci_dev->romfile = "gpxe-eepro100-80861209.rom";
-                break;
-            case PCI_DEVICE_ID_INTEL_82557:
-                pci_dev->romfile = "gpxe-eepro100-80861229.rom";
-                break;
-            case 0x2449:
-                pci_dev->romfile = "gpxe-eepro100-80862449.rom";
-                break;
-        }
+        /* We use the same rom file for all device ids.
+           QEMU fixes the device id during rom load. */
+        pci_dev->romfile = "gpxe-eepro100-80861209.rom";
         pci_dev->init = e100_nic_init;
         pci_dev->exit = pci_nic_uninit;
         pci_dev->qdev.props = e100_properties;
diff --git a/pc-bios/README b/pc-bios/README
index 3172cf7..4b019e0 100644
--- a/pc-bios/README
+++ b/pc-bios/README
@@ -16,7 +16,7 @@
 - The PXE roms come from Rom-o-Matic gPXE 0.9.9 with BANNER_TIMEOUT=0
 
   e1000 8086:100E
-  eepro100 8086:1209, 8086:1229
+  eepro100 8086:1209 (also used for 8086:1229 and 8086:2449)
   ns8390 1050:0940
   pcnet32 1022:2000
   rtl8139 10ec:8139
diff --git a/pc-bios/gpxe-eepro100-80861229.rom b/pc-bios/gpxe-eepro100-80861229.rom
deleted file mode 100644
index 9cf397e3de03c4b6441893cf07d9ea63a36a65c8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 56832
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

-- 
1.7.1

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [Qemu-devel] Re: Where's gpxe-eepro100-80862449.rom ?
  2010-10-13  7:13   ` Markus Armbruster
  2010-10-15 20:51     ` [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM Stefan Weil
  2010-10-15 20:51     ` [Qemu-devel] [PATCH 2/2] eepro100: Use a single rom file for all i825xx devices Stefan Weil
@ 2010-10-15 21:03     ` Stefan Weil
  2010-10-25 12:11       ` Markus Armbruster
  2 siblings, 1 reply; 43+ messages in thread
From: Stefan Weil @ 2010-10-15 21:03 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel

Am 13.10.2010 09:13, schrieb Markus Armbruster:
> Stefan Weil<weil@mail.berlios.de>  writes:
>
>    
>> Am 12.10.2010 14:41, schrieb Markus Armbruster:
>>      
>>> Commit db667a12 added a reference to ROM file
>>> gpxe-eepro100-80862449.rom, but no such file. Intentional?
>>>        
>> Yes. See
>> http://lists.nongnu.org/archive/html/qemu-devel/2010-05/msg00418.html
>>
>> Citation from my former mail:
>>
>>     Yes, it is missing. I did not add it for several reasons:
>>
>>     * The new variant i82801 (which needs the missing ROM) is currently
>>     not available
>>     via model=i82801 (it can be selected by experts using other methods).
>>      
> It's available via -device i82801.  -net nic,model= is obsolescent.
>
>    
>>     * Experts can get the missing ROM from ROM-o-matic.
>>
>>     * All three ROMs differ only in one or two bytes (device id). That's
>>     a waste
>>     of binary space (56832 bytes!). Therefore I plan to remove all but
>>     the first
>>     ROM file. The missing ones can be created by make or patched on the
>>     fly by
>>     QEMU during load. Maybe it is also possible to create ROM files
>>     which support
>>     more than one vendor/device entry - that would be the best solution.
>>      
> No objections to creating by make or on load, but I'd be just fine with
> the duplicated ROMs.  Disk space waste in the order of 100KiB is lost in
> the noise nowadays.  My qemu/.git is>100MiB, and my build tree for all
> targets ~1.5GiB.
>
>    
>> There is still nothing new regarding these last points
>> because I did not spend any time on them.
>>
>> Do you think there is urgent need for a gpxe-eepro100-80862449.rom binary?
>>      
> Well, "-device i82801" complains because it misses this binary.  Do we
> want to ship that way?
>    

I just sent two patches which create the rom data on load.
So -device i82801 no longer complains but gets the boot
information from dhcp (tested with i386-softmmu).

Your build tree will be made smaller by at least 50 KB :-)

Do you think these patches should be added to stable-0.13, too?

Regards,
Stefan

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-15 20:51     ` [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM Stefan Weil
@ 2010-10-15 21:05       ` Anthony Liguori
  2010-10-18 10:09         ` Gerd Hoffmann
  2010-10-18 10:04       ` Gerd Hoffmann
  1 sibling, 1 reply; 43+ messages in thread
From: Anthony Liguori @ 2010-10-15 21:05 UTC (permalink / raw)
  To: Stefan Weil
  Cc: Kevin Wolf, Michael S. Tsirkin, seabios, QEMU Developers,
	Markus Armbruster

On 10/15/2010 03:51 PM, Stefan Weil wrote:
> PCI device with different device ids sometimes share
> the same rom code. Only the device id and the checksum
> differ in a boot rom for such devices.
>    

BTW, SeaBIOS doesn't reject ROMs when they're loaded via rombar, only 
when they're loaded via romfile.

Maybe it's better to use fw_cfg to explicitly tell SeaBIOS to ignore the 
PCI device id in the rom header for a certain device?

Regards,

Anthony Liguori

> The i825xx ethernet controller family is a typical example
> which is implemented in hw/eepro100.c. It uses at least
> 3 different device ids, so normally 3 boot roms would be needed.
>
> By automatically patching the device id (and the checksum)
> in qemu, all emulated family members can share the same
> boot rom.
>
> Cc: Markus Armbruster<armbru@redhat.com>
> Cc: Michael S. Tsirkin<mst@redhat.com>
> Signed-off-by: Stefan Weil<weil@mail.berlios.de>
> ---
>   hw/pci.c |   53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>   1 files changed, 53 insertions(+), 0 deletions(-)
>
> diff --git a/hw/pci.c b/hw/pci.c
> index 1280d4d..c1f8218 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -1797,6 +1797,57 @@ static void pci_map_option_rom(PCIDevice *pdev, int region_num, pcibus_t addr, p
>       cpu_register_physical_memory(addr, size, pdev->rom_offset);
>   }
>
> +/* Patch the PCI device id in a PCI rom image if necessary.
> +   This is needed for an option rom which is used for more than one device. */
> +static void pci_patch_device_id(PCIDevice *pdev, uint8_t *ptr, int size)
> +{
> +    uint16_t vendor_id;
> +    uint16_t device_id;
> +    uint16_t rom_vendor_id;
> +    uint16_t rom_device_id;
> +    uint16_t rom_magic;
> +    uint16_t pcir_offset;
> +
> +    /* Words in rom data are little endian (like in PCI configuration),
> +       so they can be read / written with pci_get_word / pci_set_word. */
> +
> +    /* Only a valid rom will be patched. */
> +    rom_magic = pci_get_word(ptr);
> +    if (rom_magic != 0xaa55) {
> +        PCI_DPRINTF("Bad ROM magic %04x\n", rom_magic);
> +        return;
> +    }
> +    pcir_offset = pci_get_word(ptr + 0x18);
> +    if (pcir_offset + 8>= size || memcmp(ptr + pcir_offset, "PCIR", 4)) {
> +        PCI_DPRINTF("Bad PCIR offset 0x%x or signature\n", pcir_offset);
> +        return;
> +    }
> +
> +    vendor_id = pci_get_word(pdev->config + PCI_VENDOR_ID);
> +    device_id = pci_get_word(pdev->config + PCI_DEVICE_ID);
> +    rom_vendor_id = pci_get_word(ptr + pcir_offset + 4);
> +    rom_device_id = pci_get_word(ptr + pcir_offset + 6);
> +
> +    /* Don't patch a rom with wrong vendor id (might be changed if needed). */
> +    if (vendor_id != rom_vendor_id) {
> +        return;
> +    }
> +
> +    PCI_DPRINTF("ROM id %04x%04x / PCI id %04x%04x\n",
> +                vendor_id, device_id, rom_vendor_id, rom_device_id);
> +
> +    if (device_id != rom_device_id) {
> +        /* Patch device id and checksum (at offset 6 for etherboot roms). */
> +        uint8_t checksum;
> +        checksum = ptr[6];
> +        checksum += (uint8_t)rom_device_id + (uint8_t)(rom_device_id>>  8);
> +        checksum -= (uint8_t)device_id + (uint8_t)(device_id>>  8);
> +        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
> +        ptr[6] = checksum;
> +        pci_set_word(ptr + pcir_offset + 6, device_id);
> +    }
> +}
> +
>   /* Add an option rom for the device */
>   static int pci_add_option_rom(PCIDevice *pdev)
>   {
> @@ -1849,6 +1900,8 @@ static int pci_add_option_rom(PCIDevice *pdev)
>       load_image(path, ptr);
>       qemu_free(path);
>
> +    pci_patch_device_id(pdev, ptr, size);
> +
>       pci_register_bar(pdev, PCI_ROM_SLOT, size,
>                        0, pci_map_option_rom);
>
>    

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-15 20:51     ` [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM Stefan Weil
  2010-10-15 21:05       ` Anthony Liguori
@ 2010-10-18 10:04       ` Gerd Hoffmann
  2010-10-18 11:16         ` Stefan Weil
  1 sibling, 1 reply; 43+ messages in thread
From: Gerd Hoffmann @ 2010-10-18 10:04 UTC (permalink / raw)
  To: Stefan Weil; +Cc: Michael S. Tsirkin, QEMU Developers, Markus Armbruster

   Hi,

> +    /* Don't patch a rom with wrong vendor id (might be changed if needed). */
> +    if (vendor_id != rom_vendor_id) {
> +        return;
> +    }

Yes, please drop that one.  If this is accepted I'd like to use this for
vga roms too, so we have to carry only two of them instead of four.

> +    if (device_id != rom_device_id) {
> +        /* Patch device id and checksum (at offset 6 for etherboot roms). */

Does this offset work for all roms?

>   /* Add an option rom for the device */
>   static int pci_add_option_rom(PCIDevice *pdev)
>   {
> @@ -1849,6 +1900,8 @@ static int pci_add_option_rom(PCIDevice *pdev)
>       load_image(path, ptr);
>       qemu_free(path);
>
> +    pci_patch_device_id(pdev, ptr, size);
> +

I'd prefer this being opt-in per driver instead of being applied 
globally (and maybe also pass in a flag whenever a vendor mismatch is 
fine or not).

cheers,
   Gerd

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-15 21:05       ` Anthony Liguori
@ 2010-10-18 10:09         ` Gerd Hoffmann
  2010-10-18 18:39           ` Anthony Liguori
  0 siblings, 1 reply; 43+ messages in thread
From: Gerd Hoffmann @ 2010-10-18 10:09 UTC (permalink / raw)
  To: Anthony Liguori
  Cc: Kevin Wolf, Michael S. Tsirkin, seabios, QEMU Developers,
	Markus Armbruster

On 10/15/10 23:05, Anthony Liguori wrote:
> On 10/15/2010 03:51 PM, Stefan Weil wrote:
>> PCI device with different device ids sometimes share
>> the same rom code. Only the device id and the checksum
>> differ in a boot rom for such devices.
>
> BTW, SeaBIOS doesn't reject ROMs when they're loaded via rombar, only
> when they're loaded via romfile.

SeaBIOS rejects them when loaded from the rom bar and doesn't reject 
them when loaded via fw_cfg.

Using the rom bar is the prefered way though, fw_cfg is only there for 
compatibility with older versions.

> Maybe it's better to use fw_cfg to explicitly tell SeaBIOS to ignore the
> PCI device id in the rom header for a certain device?

Patching the rom is fine IMHO.  Why create + use a separate 
communication path when we can use a much simpler approach?

cheers,
   Gerd

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-18 10:04       ` Gerd Hoffmann
@ 2010-10-18 11:16         ` Stefan Weil
  2010-10-18 11:54           ` Gerd Hoffmann
  0 siblings, 1 reply; 43+ messages in thread
From: Stefan Weil @ 2010-10-18 11:16 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Michael S. Tsirkin, QEMU Developers, Markus Armbruster

Am 18.10.2010 12:04, schrieb Gerd Hoffmann:
>   Hi,
>
>> +    /* Don't patch a rom with wrong vendor id (might be changed if 
>> needed). */
>> +    if (vendor_id != rom_vendor_id) {
>> +        return;
>> +    }
>
> Yes, please drop that one.  If this is accepted I'd like to use this for
> vga roms too, so we have to carry only two of them instead of four.
>
>> +    if (device_id != rom_device_id) {
>> +        /* Patch device id and checksum (at offset 6 for etherboot 
>> roms). */
>
> Does this offset work for all roms?


As far as I know there is no well-defined checksum offset.
The checksum is simply set by modifying any byte (which
normally should be unused).

Etherboot has some unused bytes at the beginning of rom data
and always uses the same offset 6.

For other roms which also don't use the byte at offset 6, this approach
will work, too. If they store code or vital data at that location,
we destroy that data, so it won't work.

The VGA bios roms have a sequence of several bytes of zero
starting at offset 6, so maybe this data is not important and
we may change the byte at offset 6, but that should be checked
before using this mechanism.

>
>>   /* Add an option rom for the device */
>>   static int pci_add_option_rom(PCIDevice *pdev)
>>   {
>> @@ -1849,6 +1900,8 @@ static int pci_add_option_rom(PCIDevice *pdev)
>>       load_image(path, ptr);
>>       qemu_free(path);
>>
>> +    pci_patch_device_id(pdev, ptr, size);
>> +
>
> I'd prefer this being opt-in per driver instead of being applied 
> globally (and maybe also pass in a flag whenever a vendor mismatch is 
> fine or not).
>
> cheers,
>   Gerd

As long as the driver specifies the romfile name,
we get an implicitly defined behaviour: either the
rom matches and nothing special is done, or it doesn't
and the id(s) will be fixed.

So neither flag nor opt-in seems to be needed.

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-18 11:16         ` Stefan Weil
@ 2010-10-18 11:54           ` Gerd Hoffmann
  2010-10-18 13:16             ` Stefan Weil
  0 siblings, 1 reply; 43+ messages in thread
From: Gerd Hoffmann @ 2010-10-18 11:54 UTC (permalink / raw)
  To: Stefan Weil; +Cc: Markus Armbruster, QEMU Developers, Michael S. Tsirkin

   Hi,

> As far as I know there is no well-defined checksum offset.
> The checksum is simply set by modifying any byte (which
> normally should be unused).
>
> Etherboot has some unused bytes at the beginning of rom data
> and always uses the same offset 6.

Ah, so you don't actually update the checksum but change some unused 
byte to make the checksum stay the same, right?

> For other roms which also don't use the byte at offset 6, this approach
> will work, too. If they store code or vital data at that location,
> we destroy that data, so it won't work.
>
> The VGA bios roms have a sequence of several bytes of zero
> starting at offset 6, so maybe this data is not important and
> we may change the byte at offset 6, but that should be checked
> before using this mechanism.

 From vgabios:

     .org 0

     vgabios_start:
     .byte  0x55, 0xaa	/* BIOS signature */
     .byte  0x40		/* BIOS extension length */

     vgabios_entry_point:
           jmp vgabios_init_func

 From seabios:

     struct rom_header {
         u16 signature;
         u8 size;
         u8 initVector[4];
         u8 reserved[17];
         u16 pcioffset;
         u16 pnpoffset;
     } PACKED;

Hmm.  So offset 6 is the last byte of initVector.  If (and only if) you 
happen to know that the jump instruction takes 3 bytes only it is save 
to modify the unused 4th byte.  Seems to be true for both vgabios and 
etherboot/gPXE.  We can't assume this in general, although it is quite 
likely given that there hardly would be anything but a 16bit jump.

> As long as the driver specifies the romfile name,
> we get an implicitly defined behaviour: either the
> rom matches and nothing special is done, or it doesn't
> and the id(s) will be fixed.

> So neither flag nor opt-in seems to be needed.

When following this argumentation the vendor id sanity check shouldn't 
be there in the first place ;)

Note that romfile is a pci bus property, so it isn't fully under the 
drivers control because it can be overridden from the command line for 
every pci device.

cheers,
   Gerd

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-18 11:54           ` Gerd Hoffmann
@ 2010-10-18 13:16             ` Stefan Weil
  2010-10-18 13:30               ` Gerd Hoffmann
  0 siblings, 1 reply; 43+ messages in thread
From: Stefan Weil @ 2010-10-18 13:16 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Markus Armbruster, QEMU Developers, Michael S. Tsirkin

Hi,

Am 18.10.2010 13:54, schrieb Gerd Hoffmann:
>   Hi,
>
>> As far as I know there is no well-defined checksum offset.
>> The checksum is simply set by modifying any byte (which
>> normally should be unused).
>>
>> Etherboot has some unused bytes at the beginning of rom data
>> and always uses the same offset 6.
>
> Ah, so you don't actually update the checksum but change some unused 
> byte to make the checksum stay the same, right?

Right. The sum of all bytes modulo 255 must be 0.
Any byte can be modified to achieve this.

>
>> For other roms which also don't use the byte at offset 6, this approach
>> will work, too. If they store code or vital data at that location,
>> we destroy that data, so it won't work.
>>
>> The VGA bios roms have a sequence of several bytes of zero
>> starting at offset 6, so maybe this data is not important and
>> we may change the byte at offset 6, but that should be checked
>> before using this mechanism.
>
> From vgabios:
>
>     .org 0
>
>     vgabios_start:
>     .byte  0x55, 0xaa    /* BIOS signature */
>     .byte  0x40        /* BIOS extension length */
>
>     vgabios_entry_point:
>           jmp vgabios_init_func
>
> From seabios:
>
>     struct rom_header {
>         u16 signature;
>         u8 size;
>         u8 initVector[4];
>         u8 reserved[17];
>         u16 pcioffset;
>         u16 pnpoffset;
>     } PACKED;
>
> Hmm.  So offset 6 is the last byte of initVector.  If (and only if) 
> you happen to know that the jump instruction takes 3 bytes only it is 
> save to modify the unused 4th byte.  Seems to be true for both vgabios 
> and etherboot/gPXE.  We can't assume this in general, although it is 
> quite likely given that there hardly would be anything but a 16bit jump.

I agree. So it would work with vga bios, too.

It looks like vgabios uses the last byte to fix the checksum
(rom data ends with a sequence of 0xff, only last byte is different).


>
>> As long as the driver specifies the romfile name,
>> we get an implicitly defined behaviour: either the
>> rom matches and nothing special is done, or it doesn't
>> and the id(s) will be fixed.
>
>> So neither flag nor opt-in seems to be needed.
>
> When following this argumentation the vendor id sanity check shouldn't 
> be there in the first place ;)

The sanity check is simply there because I had no test case
which patches the vendor id. How could I test with vga bios?

>
> Note that romfile is a pci bus property, so it isn't fully under the 
> drivers control because it can be overridden from the command line for 
> every pci device.

Maybe this is an argument why the driver should not include any flags
for id patching. A user who overrides the rom name from the command line
should know what she/he does.

>
> cheers,
>   Gerd
>


Regards,
Stefan

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-18 13:16             ` Stefan Weil
@ 2010-10-18 13:30               ` Gerd Hoffmann
  2010-10-18 15:50                 ` Gerd Hoffmann
  0 siblings, 1 reply; 43+ messages in thread
From: Gerd Hoffmann @ 2010-10-18 13:30 UTC (permalink / raw)
  To: Stefan Weil; +Cc: Markus Armbruster, QEMU Developers, Michael S. Tsirkin

   Hi,

>> When following this argumentation the vendor id sanity check shouldn't
>> be there in the first place ;)
>
> The sanity check is simply there because I had no test case
> which patches the vendor id. How could I test with vga bios?

No trivial way as the vgabios needs to be patched to handle that.

The vgabios searches for its hardware, right now the IDs are 
compile-time constants (same constants are compiled into the pci 
header).  Needs to be changed to lookup the ID at runtime in the pci header.

cheers,
   Gerd

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-18 13:30               ` Gerd Hoffmann
@ 2010-10-18 15:50                 ` Gerd Hoffmann
  2010-10-18 17:54                   ` Stefan Weil
  2010-10-18 17:55                   ` [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and " Stefan Weil
  0 siblings, 2 replies; 43+ messages in thread
From: Gerd Hoffmann @ 2010-10-18 15:50 UTC (permalink / raw)
  To: Stefan Weil; +Cc: Markus Armbruster, QEMU Developers, Michael S. Tsirkin

On 10/18/10 15:30, Gerd Hoffmann wrote:
>   Hi,
>
>>> When following this argumentation the vendor id sanity check shouldn't
>>> be there in the first place ;)
>>
>> The sanity check is simply there because I had no test case
>> which patches the vendor id. How could I test with vga bios?
>
> No trivial way as the vgabios needs to be patched to handle that.

patchrom branches available now:

http://cgit.freedesktop.org/~kraxel/vgabios/log/
http://cgit.freedesktop.org/spice/qemu/log/?h=patchrom

very short instructions:

(1) fetch+compile vgabios, copy new vgabios-pci binary
     so qemu can find it.
(2) fetch qemu, apply/merge id patching, compile qemu
(3) both standard and vmware vga should happily work
     with the same vgabios binary now, including vesa
     graphic modes.

cheers,
   Gerd

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-18 15:50                 ` Gerd Hoffmann
@ 2010-10-18 17:54                   ` Stefan Weil
  2010-10-18 17:55                   ` [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and " Stefan Weil
  1 sibling, 0 replies; 43+ messages in thread
From: Stefan Weil @ 2010-10-18 17:54 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Markus Armbruster, QEMU Developers, Michael S. Tsirkin

Am 18.10.2010 17:50, schrieb Gerd Hoffmann:
> On 10/18/10 15:30, Gerd Hoffmann wrote:
>>   Hi,
>>
>>>> When following this argumentation the vendor id sanity check shouldn't
>>>> be there in the first place ;)
>>>
>>> The sanity check is simply there because I had no test case
>>> which patches the vendor id. How could I test with vga bios?
>>
>> No trivial way as the vgabios needs to be patched to handle that.
>
> patchrom branches available now:
>
> http://cgit.freedesktop.org/~kraxel/vgabios/log/
> http://cgit.freedesktop.org/spice/qemu/log/?h=patchrom
>
> very short instructions:
>
> (1) fetch+compile vgabios, copy new vgabios-pci binary
>     so qemu can find it.
> (2) fetch qemu, apply/merge id patching, compile qemu
> (3) both standard and vmware vga should happily work
>     with the same vgabios binary now, including vesa
>     graphic modes.
>
> cheers,
>   Gerd
>

Hi Gerd,

a new patch which also modifies the vendor id will follow
immediately. Perhaps you can try it with your modified vga bios.

Cheers,
Stefan

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 15:50                 ` Gerd Hoffmann
  2010-10-18 17:54                   ` Stefan Weil
@ 2010-10-18 17:55                   ` Stefan Weil
  2010-10-18 17:58                     ` [Qemu-devel] " Michael S. Tsirkin
  2010-10-18 18:44                     ` [Qemu-devel] " Anthony Liguori
  1 sibling, 2 replies; 43+ messages in thread
From: Stefan Weil @ 2010-10-18 17:55 UTC (permalink / raw)
  To: QEMU Developers; +Cc: Michael S. Tsirkin, Gerd Hoffmann, Markus Armbruster

PCI devices with different vendor or device ids sometimes share
the same rom code. Only the ids and the checksum
differs in a boot rom for such devices.

The i825xx ethernet controller family is a typical example
which is implemented in hw/eepro100.c. It uses at least
3 different device ids, so normally 3 boot roms would be needed.

By automatically patching vendor id and device id (and the checksum)
in qemu, all emulated family members can share the same boot rom.

VGA bios roms are another example with different vendor and device ids.

v2:

* Patch also the vendor id (and remove the sanity check for vendor id).

Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Markus Armbruster <armbru@redhat.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Stefan Weil <weil@mail.berlios.de>
---
 hw/pci.c |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 58 insertions(+), 0 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index 1280d4d..139eb24 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -1797,6 +1797,62 @@ static void pci_map_option_rom(PCIDevice *pdev, int region_num, pcibus_t addr, p
     cpu_register_physical_memory(addr, size, pdev->rom_offset);
 }
 
+/* Patch the PCI vendor and device ids in a PCI rom image if necessary.
+   This is needed for an option rom which is used for more than one device. */
+static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
+{
+    uint16_t vendor_id;
+    uint16_t device_id;
+    uint16_t rom_vendor_id;
+    uint16_t rom_device_id;
+    uint16_t rom_magic;
+    uint16_t pcir_offset;
+    uint8_t checksum;
+
+    /* Words in rom data are little endian (like in PCI configuration),
+       so they can be read / written with pci_get_word / pci_set_word. */
+
+    /* Only a valid rom will be patched. */
+    rom_magic = pci_get_word(ptr);
+    if (rom_magic != 0xaa55) {
+        PCI_DPRINTF("Bad ROM magic %04x\n", rom_magic);
+        return;
+    }
+    pcir_offset = pci_get_word(ptr + 0x18);
+    if (pcir_offset + 8 >= size || memcmp(ptr + pcir_offset, "PCIR", 4)) {
+        PCI_DPRINTF("Bad PCIR offset 0x%x or signature\n", pcir_offset);
+        return;
+    }
+
+    vendor_id = pci_get_word(pdev->config + PCI_VENDOR_ID);
+    device_id = pci_get_word(pdev->config + PCI_DEVICE_ID);
+    rom_vendor_id = pci_get_word(ptr + pcir_offset + 4);
+    rom_device_id = pci_get_word(ptr + pcir_offset + 6);
+
+    PCI_DPRINTF("ROM id %04x%04x / PCI id %04x%04x\n",
+                vendor_id, device_id, rom_vendor_id, rom_device_id);
+
+    checksum = ptr[6];
+
+    if (vendor_id != rom_vendor_id) {
+        /* Patch vendor id and checksum (at offset 6 for etherboot roms). */
+        checksum += (uint8_t)rom_vendor_id + (uint8_t)(rom_vendor_id >> 8);
+        checksum -= (uint8_t)vendor_id + (uint8_t)(vendor_id >> 8);
+        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
+        ptr[6] = checksum;
+        pci_set_word(ptr + pcir_offset + 4, vendor_id);
+    }
+
+    if (device_id != rom_device_id) {
+        /* Patch device id and checksum (at offset 6 for etherboot roms). */
+        checksum += (uint8_t)rom_device_id + (uint8_t)(rom_device_id >> 8);
+        checksum -= (uint8_t)device_id + (uint8_t)(device_id >> 8);
+        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
+        ptr[6] = checksum;
+        pci_set_word(ptr + pcir_offset + 6, device_id);
+    }
+}
+
 /* Add an option rom for the device */
 static int pci_add_option_rom(PCIDevice *pdev)
 {
@@ -1849,6 +1905,8 @@ static int pci_add_option_rom(PCIDevice *pdev)
     load_image(path, ptr);
     qemu_free(path);
 
+    pci_patch_ids(pdev, ptr, size);
+
     pci_register_bar(pdev, PCI_ROM_SLOT, size,
                      0, pci_map_option_rom);
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* [Qemu-devel] Re: [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 17:55                   ` [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and " Stefan Weil
@ 2010-10-18 17:58                     ` Michael S. Tsirkin
  2010-10-18 18:42                       ` Anthony Liguori
  2010-10-18 18:44                     ` [Qemu-devel] " Anthony Liguori
  1 sibling, 1 reply; 43+ messages in thread
From: Michael S. Tsirkin @ 2010-10-18 17:58 UTC (permalink / raw)
  To: Stefan Weil; +Cc: Markus Armbruster, QEMU Developers, Gerd Hoffmann

On Mon, Oct 18, 2010 at 07:55:11PM +0200, Stefan Weil wrote:
> PCI devices with different vendor or device ids sometimes share
> the same rom code. Only the ids and the checksum
> differs in a boot rom for such devices.
> 
> The i825xx ethernet controller family is a typical example
> which is implemented in hw/eepro100.c. It uses at least
> 3 different device ids, so normally 3 boot roms would be needed.
> 
> By automatically patching vendor id and device id (and the checksum)
> in qemu, all emulated family members can share the same boot rom.
> 
> VGA bios roms are another example with different vendor and device ids.
> 
> v2:
> 
> * Patch also the vendor id (and remove the sanity check for vendor id).
> 
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Cc: Markus Armbruster <armbru@redhat.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Stefan Weil <weil@mail.berlios.de>
> ---
>  hw/pci.c |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 58 insertions(+), 0 deletions(-)
> 
> diff --git a/hw/pci.c b/hw/pci.c
> index 1280d4d..139eb24 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -1797,6 +1797,62 @@ static void pci_map_option_rom(PCIDevice *pdev, int region_num, pcibus_t addr, p
>      cpu_register_physical_memory(addr, size, pdev->rom_offset);
>  }
>  
> +/* Patch the PCI vendor and device ids in a PCI rom image if necessary.
> +   This is needed for an option rom which is used for more than one device. */
> +static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)

let's return an error code on malformed roms so management can detect errors?

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-18 10:09         ` Gerd Hoffmann
@ 2010-10-18 18:39           ` Anthony Liguori
  2010-10-21 10:09             ` [SeaBIOS] " Avi Kivity
  0 siblings, 1 reply; 43+ messages in thread
From: Anthony Liguori @ 2010-10-18 18:39 UTC (permalink / raw)
  To: Gerd Hoffmann
  Cc: Kevin Wolf, Michael S. Tsirkin, seabios, QEMU Developers,
	Markus Armbruster

On 10/18/2010 05:09 AM, Gerd Hoffmann wrote:
> On 10/15/10 23:05, Anthony Liguori wrote:
>> On 10/15/2010 03:51 PM, Stefan Weil wrote:
>>> PCI device with different device ids sometimes share
>>> the same rom code. Only the device id and the checksum
>>> differ in a boot rom for such devices.
>>
>> BTW, SeaBIOS doesn't reject ROMs when they're loaded via rombar, only
>> when they're loaded via romfile.
>
> SeaBIOS rejects them when loaded from the rom bar and doesn't reject 
> them when loaded via fw_cfg.

What I meant was, rombar=0 in qdev.  Sometimes my fingers don't work the 
same way my brain does :-)

> Using the rom bar is the prefered way though, fw_cfg is only there for 
> compatibility with older versions.
>
>> Maybe it's better to use fw_cfg to explicitly tell SeaBIOS to ignore the
>> PCI device id in the rom header for a certain device?
>
> Patching the rom is fine IMHO.  Why create + use a separate 
> communication path when we can use a much simpler approach?

How does this interact with PCI device passthrough?

We clearly can't patch in that case whereas if we had a hint to SeaBIOS, 
it would still work.

Regards,

Anthony Liguori

> cheers,
>   Gerd
>

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] Re: [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 17:58                     ` [Qemu-devel] " Michael S. Tsirkin
@ 2010-10-18 18:42                       ` Anthony Liguori
  2010-10-18 19:03                         ` Michael S. Tsirkin
  0 siblings, 1 reply; 43+ messages in thread
From: Anthony Liguori @ 2010-10-18 18:42 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Gerd Hoffmann, Markus Armbruster, QEMU Developers

On 10/18/2010 12:58 PM, Michael S. Tsirkin wrote:
> On Mon, Oct 18, 2010 at 07:55:11PM +0200, Stefan Weil wrote:
>    
>> PCI devices with different vendor or device ids sometimes share
>> the same rom code. Only the ids and the checksum
>> differs in a boot rom for such devices.
>>
>> The i825xx ethernet controller family is a typical example
>> which is implemented in hw/eepro100.c. It uses at least
>> 3 different device ids, so normally 3 boot roms would be needed.
>>
>> By automatically patching vendor id and device id (and the checksum)
>> in qemu, all emulated family members can share the same boot rom.
>>
>> VGA bios roms are another example with different vendor and device ids.
>>
>> v2:
>>
>> * Patch also the vendor id (and remove the sanity check for vendor id).
>>
>> Cc: Gerd Hoffmann<kraxel@redhat.com>
>> Cc: Markus Armbruster<armbru@redhat.com>
>> Cc: Michael S. Tsirkin<mst@redhat.com>
>> Signed-off-by: Stefan Weil<weil@mail.berlios.de>
>> ---
>>   hw/pci.c |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>   1 files changed, 58 insertions(+), 0 deletions(-)
>>
>> diff --git a/hw/pci.c b/hw/pci.c
>> index 1280d4d..139eb24 100644
>> --- a/hw/pci.c
>> +++ b/hw/pci.c
>> @@ -1797,6 +1797,62 @@ static void pci_map_option_rom(PCIDevice *pdev, int region_num, pcibus_t addr, p
>>       cpu_register_physical_memory(addr, size, pdev->rom_offset);
>>   }
>>
>> +/* Patch the PCI vendor and device ids in a PCI rom image if necessary.
>> +   This is needed for an option rom which is used for more than one device. */
>> +static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
>>      
> let's return an error code on malformed roms so management can detect errors?
>    

A bad/missing PnP header does not mean it's an invalid ROM.

Regards,

Anthony Liguori

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 17:55                   ` [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and " Stefan Weil
  2010-10-18 17:58                     ` [Qemu-devel] " Michael S. Tsirkin
@ 2010-10-18 18:44                     ` Anthony Liguori
  2010-10-18 18:53                       ` Anthony Liguori
  1 sibling, 1 reply; 43+ messages in thread
From: Anthony Liguori @ 2010-10-18 18:44 UTC (permalink / raw)
  To: Stefan Weil
  Cc: Markus Armbruster, Gerd Hoffmann, QEMU Developers, Michael S. Tsirkin

On 10/18/2010 12:55 PM, Stefan Weil wrote:
> PCI devices with different vendor or device ids sometimes share
> the same rom code. Only the ids and the checksum
> differs in a boot rom for such devices.
>
> The i825xx ethernet controller family is a typical example
> which is implemented in hw/eepro100.c. It uses at least
> 3 different device ids, so normally 3 boot roms would be needed.
>
> By automatically patching vendor id and device id (and the checksum)
> in qemu, all emulated family members can share the same boot rom.
>
> VGA bios roms are another example with different vendor and device ids.
>
> v2:
>
> * Patch also the vendor id (and remove the sanity check for vendor id).
>
> Cc: Gerd Hoffmann<kraxel@redhat.com>
> Cc: Markus Armbruster<armbru@redhat.com>
> Cc: Michael S. Tsirkin<mst@redhat.com>
> Signed-off-by: Stefan Weil<weil@mail.berlios.de>
>    

I get very nervous about patching a ROM.  Who's to say that the ROM 
doesn't somehow depend on the contents of its header?  Maybe it has an 
internal CRC built into it or something like that.

Regards,

Anthony Liguori

> ---
>   hw/pci.c |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>   1 files changed, 58 insertions(+), 0 deletions(-)
>
> diff --git a/hw/pci.c b/hw/pci.c
> index 1280d4d..139eb24 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -1797,6 +1797,62 @@ static void pci_map_option_rom(PCIDevice *pdev, int region_num, pcibus_t addr, p
>       cpu_register_physical_memory(addr, size, pdev->rom_offset);
>   }
>
> +/* Patch the PCI vendor and device ids in a PCI rom image if necessary.
> +   This is needed for an option rom which is used for more than one device. */
> +static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
> +{
> +    uint16_t vendor_id;
> +    uint16_t device_id;
> +    uint16_t rom_vendor_id;
> +    uint16_t rom_device_id;
> +    uint16_t rom_magic;
> +    uint16_t pcir_offset;
> +    uint8_t checksum;
> +
> +    /* Words in rom data are little endian (like in PCI configuration),
> +       so they can be read / written with pci_get_word / pci_set_word. */
> +
> +    /* Only a valid rom will be patched. */
> +    rom_magic = pci_get_word(ptr);
> +    if (rom_magic != 0xaa55) {
> +        PCI_DPRINTF("Bad ROM magic %04x\n", rom_magic);
> +        return;
> +    }
> +    pcir_offset = pci_get_word(ptr + 0x18);
> +    if (pcir_offset + 8>= size || memcmp(ptr + pcir_offset, "PCIR", 4)) {
> +        PCI_DPRINTF("Bad PCIR offset 0x%x or signature\n", pcir_offset);
> +        return;
> +    }
> +
> +    vendor_id = pci_get_word(pdev->config + PCI_VENDOR_ID);
> +    device_id = pci_get_word(pdev->config + PCI_DEVICE_ID);
> +    rom_vendor_id = pci_get_word(ptr + pcir_offset + 4);
> +    rom_device_id = pci_get_word(ptr + pcir_offset + 6);
> +
> +    PCI_DPRINTF("ROM id %04x%04x / PCI id %04x%04x\n",
> +                vendor_id, device_id, rom_vendor_id, rom_device_id);
> +
> +    checksum = ptr[6];
> +
> +    if (vendor_id != rom_vendor_id) {
> +        /* Patch vendor id and checksum (at offset 6 for etherboot roms). */
> +        checksum += (uint8_t)rom_vendor_id + (uint8_t)(rom_vendor_id>>  8);
> +        checksum -= (uint8_t)vendor_id + (uint8_t)(vendor_id>>  8);
> +        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
> +        ptr[6] = checksum;
> +        pci_set_word(ptr + pcir_offset + 4, vendor_id);
> +    }
> +
> +    if (device_id != rom_device_id) {
> +        /* Patch device id and checksum (at offset 6 for etherboot roms). */
> +        checksum += (uint8_t)rom_device_id + (uint8_t)(rom_device_id>>  8);
> +        checksum -= (uint8_t)device_id + (uint8_t)(device_id>>  8);
> +        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
> +        ptr[6] = checksum;
> +        pci_set_word(ptr + pcir_offset + 6, device_id);
> +    }
> +}
> +
>   /* Add an option rom for the device */
>   static int pci_add_option_rom(PCIDevice *pdev)
>   {
> @@ -1849,6 +1905,8 @@ static int pci_add_option_rom(PCIDevice *pdev)
>       load_image(path, ptr);
>       qemu_free(path);
>
> +    pci_patch_ids(pdev, ptr, size);
> +
>       pci_register_bar(pdev, PCI_ROM_SLOT, size,
>                        0, pci_map_option_rom);
>
>    

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 18:44                     ` [Qemu-devel] " Anthony Liguori
@ 2010-10-18 18:53                       ` Anthony Liguori
  2010-10-18 19:11                         ` Stefan Weil
  2010-10-19 21:08                         ` Stefan Weil
  0 siblings, 2 replies; 43+ messages in thread
From: Anthony Liguori @ 2010-10-18 18:53 UTC (permalink / raw)
  Cc: QEMU Developers, Michael S. Tsirkin, Markus Armbruster, Gerd Hoffmann

On 10/18/2010 01:44 PM, Anthony Liguori wrote:
> On 10/18/2010 12:55 PM, Stefan Weil wrote:
>> PCI devices with different vendor or device ids sometimes share
>> the same rom code. Only the ids and the checksum
>> differs in a boot rom for such devices.
>>
>> The i825xx ethernet controller family is a typical example
>> which is implemented in hw/eepro100.c. It uses at least
>> 3 different device ids, so normally 3 boot roms would be needed.
>>
>> By automatically patching vendor id and device id (and the checksum)
>> in qemu, all emulated family members can share the same boot rom.
>>
>> VGA bios roms are another example with different vendor and device ids.
>>
>> v2:
>>
>> * Patch also the vendor id (and remove the sanity check for vendor id).
>>
>> Cc: Gerd Hoffmann<kraxel@redhat.com>
>> Cc: Markus Armbruster<armbru@redhat.com>
>> Cc: Michael S. Tsirkin<mst@redhat.com>
>> Signed-off-by: Stefan Weil<weil@mail.berlios.de>
>
> I get very nervous about patching a ROM.  Who's to say that the ROM 
> doesn't somehow depend on the contents of its header?  Maybe it has an 
> internal CRC built into it or something like that.

As part of PMM, ROMs typically reduce their size by decompressing and 
removing code or something of that nature and then rewrite themselves in 
scratch RAM.  The BIOS then copies the resulting ROM (using the ROM size 
in the base header as an indication of how much to copy) into the option 
ROM space.

So the likelihood of depending on the contents of the header seems 
non-trivial to me.

Regards,

Anthony Liguori

> Regards,
>
> Anthony Liguori
>
>> ---
>>   hw/pci.c |   58 
>> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>   1 files changed, 58 insertions(+), 0 deletions(-)
>>
>> diff --git a/hw/pci.c b/hw/pci.c
>> index 1280d4d..139eb24 100644
>> --- a/hw/pci.c
>> +++ b/hw/pci.c
>> @@ -1797,6 +1797,62 @@ static void pci_map_option_rom(PCIDevice 
>> *pdev, int region_num, pcibus_t addr, p
>>       cpu_register_physical_memory(addr, size, pdev->rom_offset);
>>   }
>>
>> +/* Patch the PCI vendor and device ids in a PCI rom image if necessary.
>> +   This is needed for an option rom which is used for more than one 
>> device. */
>> +static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
>> +{
>> +    uint16_t vendor_id;
>> +    uint16_t device_id;
>> +    uint16_t rom_vendor_id;
>> +    uint16_t rom_device_id;
>> +    uint16_t rom_magic;
>> +    uint16_t pcir_offset;
>> +    uint8_t checksum;
>> +
>> +    /* Words in rom data are little endian (like in PCI configuration),
>> +       so they can be read / written with pci_get_word / 
>> pci_set_word. */
>> +
>> +    /* Only a valid rom will be patched. */
>> +    rom_magic = pci_get_word(ptr);
>> +    if (rom_magic != 0xaa55) {
>> +        PCI_DPRINTF("Bad ROM magic %04x\n", rom_magic);
>> +        return;
>> +    }
>> +    pcir_offset = pci_get_word(ptr + 0x18);
>> +    if (pcir_offset + 8>= size || memcmp(ptr + pcir_offset, "PCIR", 
>> 4)) {
>> +        PCI_DPRINTF("Bad PCIR offset 0x%x or signature\n", 
>> pcir_offset);
>> +        return;
>> +    }
>> +
>> +    vendor_id = pci_get_word(pdev->config + PCI_VENDOR_ID);
>> +    device_id = pci_get_word(pdev->config + PCI_DEVICE_ID);
>> +    rom_vendor_id = pci_get_word(ptr + pcir_offset + 4);
>> +    rom_device_id = pci_get_word(ptr + pcir_offset + 6);
>> +
>> +    PCI_DPRINTF("ROM id %04x%04x / PCI id %04x%04x\n",
>> +                vendor_id, device_id, rom_vendor_id, rom_device_id);
>> +
>> +    checksum = ptr[6];
>> +
>> +    if (vendor_id != rom_vendor_id) {
>> +        /* Patch vendor id and checksum (at offset 6 for etherboot 
>> roms). */
>> +        checksum += (uint8_t)rom_vendor_id + 
>> (uint8_t)(rom_vendor_id>>  8);
>> +        checksum -= (uint8_t)vendor_id + (uint8_t)(vendor_id>>  8);
>> +        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
>> +        ptr[6] = checksum;
>> +        pci_set_word(ptr + pcir_offset + 4, vendor_id);
>> +    }
>> +
>> +    if (device_id != rom_device_id) {
>> +        /* Patch device id and checksum (at offset 6 for etherboot 
>> roms). */
>> +        checksum += (uint8_t)rom_device_id + 
>> (uint8_t)(rom_device_id>>  8);
>> +        checksum -= (uint8_t)device_id + (uint8_t)(device_id>>  8);
>> +        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
>> +        ptr[6] = checksum;
>> +        pci_set_word(ptr + pcir_offset + 6, device_id);
>> +    }
>> +}
>> +
>>   /* Add an option rom for the device */
>>   static int pci_add_option_rom(PCIDevice *pdev)
>>   {
>> @@ -1849,6 +1905,8 @@ static int pci_add_option_rom(PCIDevice *pdev)
>>       load_image(path, ptr);
>>       qemu_free(path);
>>
>> +    pci_patch_ids(pdev, ptr, size);
>> +
>>       pci_register_bar(pdev, PCI_ROM_SLOT, size,
>>                        0, pci_map_option_rom);
>>
>
>

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] Re: [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 18:42                       ` Anthony Liguori
@ 2010-10-18 19:03                         ` Michael S. Tsirkin
  2010-10-18 19:36                           ` Stefan Weil
  2010-10-18 19:56                           ` Anthony Liguori
  0 siblings, 2 replies; 43+ messages in thread
From: Michael S. Tsirkin @ 2010-10-18 19:03 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: Gerd Hoffmann, Markus Armbruster, QEMU Developers

On Mon, Oct 18, 2010 at 01:42:06PM -0500, Anthony Liguori wrote:
> >>+/* Patch the PCI vendor and device ids in a PCI rom image if necessary.
> >>+   This is needed for an option rom which is used for more than one device. */
> >>+static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
> >let's return an error code on malformed roms so management can detect errors?
> 
> A bad/missing PnP header does not mean it's an invalid ROM.

I don't see this as a generic capability - rather a specific
hack that helps reduce some duplication for eepro100 and friends.
As such, if we can't patch the id we know it's an invalid file.

-- 
MST

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 18:53                       ` Anthony Liguori
@ 2010-10-18 19:11                         ` Stefan Weil
  2010-10-19  8:37                           ` Michael S. Tsirkin
  2010-10-19 21:08                         ` Stefan Weil
  1 sibling, 1 reply; 43+ messages in thread
From: Stefan Weil @ 2010-10-18 19:11 UTC (permalink / raw)
  To: Anthony Liguori
  Cc: QEMU Developers, Michael S. Tsirkin, Markus Armbruster, Gerd Hoffmann

Am 18.10.2010 20:53, schrieb Anthony Liguori:
> On 10/18/2010 01:44 PM, Anthony Liguori wrote:
>> On 10/18/2010 12:55 PM, Stefan Weil wrote:
>>> PCI devices with different vendor or device ids sometimes share
>>> the same rom code. Only the ids and the checksum
>>> differs in a boot rom for such devices.
>>>
>>> The i825xx ethernet controller family is a typical example
>>> which is implemented in hw/eepro100.c. It uses at least
>>> 3 different device ids, so normally 3 boot roms would be needed.
>>>
>>> By automatically patching vendor id and device id (and the checksum)
>>> in qemu, all emulated family members can share the same boot rom.
>>>
>>> VGA bios roms are another example with different vendor and device ids.
>>>
>>> v2:
>>>
>>> * Patch also the vendor id (and remove the sanity check for vendor id).
>>>
>>> Cc: Gerd Hoffmann<kraxel@redhat.com>
>>> Cc: Markus Armbruster<armbru@redhat.com>
>>> Cc: Michael S. Tsirkin<mst@redhat.com>
>>> Signed-off-by: Stefan Weil<weil@mail.berlios.de>
>>
>> I get very nervous about patching a ROM.  Who's to say that the ROM 
>> doesn't somehow depend on the contents of its header?  Maybe it has 
>> an internal CRC built into it or something like that.
>
> As part of PMM, ROMs typically reduce their size by decompressing and 
> removing code or something of that nature and then rewrite themselves 
> in scratch RAM.  The BIOS then copies the resulting ROM (using the ROM 
> size in the base header as an indication of how much to copy) into the 
> option ROM space.
>
> So the likelihood of depending on the contents of the header seems 
> non-trivial to me.
>
> Regards,
>
> Anthony Liguori
>
[snip]

Etherboot uses compressed code and always fixes the checksum by modifying
the byte at relative address 6, so for etherboot there is no problem.
The etherboot distribution even includes a perl script which can be used
to patch vendor/device ids. I thought about using that script in QEMU's
make but then decided against this alternate solution.

VGA bios seems to work, too (practical test still is missing).

What could happen for other kinds of roms? Either there is nothing
to patch (the 99 % standard case), or they work, or they don't work.
QEMU must only make sure that patching of the supported roms
with supported devices work.

Regards,

Stefan Weil

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] Re: [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 19:03                         ` Michael S. Tsirkin
@ 2010-10-18 19:36                           ` Stefan Weil
  2010-10-18 19:59                             ` Anthony Liguori
  2010-10-19  6:40                             ` Gerd Hoffmann
  2010-10-18 19:56                           ` Anthony Liguori
  1 sibling, 2 replies; 43+ messages in thread
From: Stefan Weil @ 2010-10-18 19:36 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Gerd Hoffmann, Markus Armbruster, QEMU Developers

Am 18.10.2010 21:03, schrieb Michael S. Tsirkin:
> On Mon, Oct 18, 2010 at 01:42:06PM -0500, Anthony Liguori wrote:
>>>> +/* Patch the PCI vendor and device ids in a PCI rom image if 
>>>> necessary.
>>>> + This is needed for an option rom which is used for more than one 
>>>> device. */
>>>> +static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
>>> let's return an error code on malformed roms so management can 
>>> detect errors?
>>
>> A bad/missing PnP header does not mean it's an invalid ROM.
>
> I don't see this as a generic capability - rather a specific
> hack that helps reduce some duplication for eepro100 and friends.
> As such, if we can't patch the id we know it's an invalid file.

There is already some kind of error feedback: the rom will not work.
For etherboot roms, booting from network won't work.

This is a qemu internal error, so more error handling is not needed.

Users who configure a device with their own rom file don't
need an id patch, and their rom data will not be patched
because they normally specify a rom file with correct ids.
For the rare case where they configure a rom with a "wrong"
id, their rom data will be patched (something they don't expect)
or not modified because of the sanity checks (then the rom
is ignored by the bios).

Maybe a more perfect solution would only patch the preconfigured
rom files but not user configured files, but I don't think we
need this degree of perfection.

Regards,
Stefan

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] Re: [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 19:03                         ` Michael S. Tsirkin
  2010-10-18 19:36                           ` Stefan Weil
@ 2010-10-18 19:56                           ` Anthony Liguori
  1 sibling, 0 replies; 43+ messages in thread
From: Anthony Liguori @ 2010-10-18 19:56 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: Gerd Hoffmann, Markus Armbruster, QEMU Developers

On 10/18/2010 02:03 PM, Michael S. Tsirkin wrote:
> On Mon, Oct 18, 2010 at 01:42:06PM -0500, Anthony Liguori wrote:
>    
>>>> +/* Patch the PCI vendor and device ids in a PCI rom image if necessary.
>>>> +   This is needed for an option rom which is used for more than one device. */
>>>> +static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
>>>>          
>>> let's return an error code on malformed roms so management can detect errors?
>>>        
>> A bad/missing PnP header does not mean it's an invalid ROM.
>>      
> I don't see this as a generic capability - rather a specific
> hack that helps reduce some duplication for eepro100 and friends.
> As such, if we can't patch the id we know it's an invalid file.
>    

This code is unconditional in the pci option rom loading path.

If it's restricted to a qdev property that's defaulted to enabled for 
the eepro cards, that would be a reasonable argument to make.

Regards,

Anthony Liguori

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] Re: [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 19:36                           ` Stefan Weil
@ 2010-10-18 19:59                             ` Anthony Liguori
  2010-10-19  6:40                             ` Gerd Hoffmann
  1 sibling, 0 replies; 43+ messages in thread
From: Anthony Liguori @ 2010-10-18 19:59 UTC (permalink / raw)
  To: Stefan Weil
  Cc: QEMU Developers, Gerd Hoffmann, Markus Armbruster, Michael S. Tsirkin

On 10/18/2010 02:36 PM, Stefan Weil wrote:
> Maybe a more perfect solution would only patch the preconfigured
> rom files but not user configured files, but I don't think we
> need this degree of perfection.

Generally speaking, patching third-party code is not something that we 
should get in the habit of doing unless we're very very sure that it's 
okay and we have as many checks in place as possible to avoid bad things 
from happening.

There are so many bad things that can happen.  If attempted to support 
attestation in QEMU and prepopulated a virtual TPM with checksums from 
the BIOS and ROMs, when the virtual BIOS attempts to measure itself if 
we've patched the ROM underneath of it, then the measurements will fail.

In the very least, if we go this route, it has to be an optional feature.

Regards,

Anthony Liguori

> Regards,
> Stefan
>

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] Re: [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 19:36                           ` Stefan Weil
  2010-10-18 19:59                             ` Anthony Liguori
@ 2010-10-19  6:40                             ` Gerd Hoffmann
  1 sibling, 0 replies; 43+ messages in thread
From: Gerd Hoffmann @ 2010-10-19  6:40 UTC (permalink / raw)
  To: Stefan Weil; +Cc: QEMU Developers, Markus Armbruster, Michael S. Tsirkin

On 10/18/10 21:36, Stefan Weil wrote:
> There is already some kind of error feedback: the rom will not work.
> For etherboot roms, booting from network won't work.

VGA works, after hacking the vgabios to not have the PCI ID hardcoded 
elsewhere.

Nevertheless /me gets the feeling that we better should not take that 
route.  vgabios needs special patching to work.  etherboot does not work 
as-is.  Even if we make it work now it always will be fragile.  The next 
rom update might break it again.  The ID automagically adapting doesn't 
happen on real hardware ...

cheers,
   Gerd

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 19:11                         ` Stefan Weil
@ 2010-10-19  8:37                           ` Michael S. Tsirkin
  2010-10-19 21:15                             ` Stefan Weil
  0 siblings, 1 reply; 43+ messages in thread
From: Michael S. Tsirkin @ 2010-10-19  8:37 UTC (permalink / raw)
  To: Stefan Weil; +Cc: QEMU Developers, Markus Armbruster, Gerd Hoffmann

On Mon, Oct 18, 2010 at 09:11:55PM +0200, Stefan Weil wrote:
> QEMU must only make sure that patching of the supported roms
> with supported devices work.

I think that's what Anthony was saying too - make this depend
on a qdev property and set it only in eepro100 for now.

-- 
MST

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-18 18:53                       ` Anthony Liguori
  2010-10-18 19:11                         ` Stefan Weil
@ 2010-10-19 21:08                         ` Stefan Weil
  2010-10-20  7:19                           ` [Qemu-devel] " Gerd Hoffmann
  2010-11-22  6:29                           ` Michael S. Tsirkin
  1 sibling, 2 replies; 43+ messages in thread
From: Stefan Weil @ 2010-10-19 21:08 UTC (permalink / raw)
  To: QEMU Developers; +Cc: Michael S. Tsirkin, Gerd Hoffmann, Markus Armbruster

PCI devices with different vendor or device ids sometimes share
the same rom code. Only the ids and the checksum
differs in a boot rom for such devices.

The i825xx ethernet controller family is a typical example
which is implemented in hw/eepro100.c. It uses at least
3 different device ids, so normally 3 boot roms would be needed.

By automatically patching vendor id and device id (and the checksum)
in qemu, all emulated family members can share the same boot rom.

VGA bios roms are another example with different vendor and device ids.

Only qemu's built-in default rom files will be patched.

v2:
    * Patch also the vendor id (and remove the sanity check for vendor id).

v3:
    * Don't patch a rom file when its name was set by the user.
      Thus we avoid modifications of unknown rom data.

Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Markus Armbruster <armbru@redhat.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Stefan Weil <weil@mail.berlios.de>
---
 hw/pci.c |   73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 69 insertions(+), 4 deletions(-)

diff --git a/hw/pci.c b/hw/pci.c
index 1280d4d..74cbea5 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -78,7 +78,7 @@ static struct BusInfo pci_bus_info = {
 
 static void pci_update_mappings(PCIDevice *d);
 static void pci_set_irq(void *opaque, int irq_num, int level);
-static int pci_add_option_rom(PCIDevice *pdev);
+static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom);
 static void pci_del_option_rom(PCIDevice *pdev);
 
 static uint16_t pci_default_sub_vendor_id = PCI_SUBVENDOR_ID_REDHAT_QUMRANET;
@@ -1672,6 +1672,7 @@ static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
     PCIDeviceInfo *info = container_of(base, PCIDeviceInfo, qdev);
     PCIBus *bus;
     int devfn, rc;
+    bool is_default_rom;
 
     /* initialize cap_present for pci_is_express() and pci_config_size() */
     if (info->is_express) {
@@ -1692,9 +1693,12 @@ static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
     }
 
     /* rom loading */
-    if (pci_dev->romfile == NULL && info->romfile != NULL)
+    is_default_rom = false;
+    if (pci_dev->romfile == NULL && info->romfile != NULL) {
         pci_dev->romfile = qemu_strdup(info->romfile);
-    pci_add_option_rom(pci_dev);
+        is_default_rom = true;
+    }
+    pci_add_option_rom(pci_dev, is_default_rom);
 
     if (qdev->hotplugged) {
         rc = bus->hotplug(bus->hotplug_qdev, pci_dev, 1);
@@ -1797,8 +1801,64 @@ static void pci_map_option_rom(PCIDevice *pdev, int region_num, pcibus_t addr, p
     cpu_register_physical_memory(addr, size, pdev->rom_offset);
 }
 
+/* Patch the PCI vendor and device ids in a PCI rom image if necessary.
+   This is needed for an option rom which is used for more than one device. */
+static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
+{
+    uint16_t vendor_id;
+    uint16_t device_id;
+    uint16_t rom_vendor_id;
+    uint16_t rom_device_id;
+    uint16_t rom_magic;
+    uint16_t pcir_offset;
+    uint8_t checksum;
+
+    /* Words in rom data are little endian (like in PCI configuration),
+       so they can be read / written with pci_get_word / pci_set_word. */
+
+    /* Only a valid rom will be patched. */
+    rom_magic = pci_get_word(ptr);
+    if (rom_magic != 0xaa55) {
+        PCI_DPRINTF("Bad ROM magic %04x\n", rom_magic);
+        return;
+    }
+    pcir_offset = pci_get_word(ptr + 0x18);
+    if (pcir_offset + 8 >= size || memcmp(ptr + pcir_offset, "PCIR", 4)) {
+        PCI_DPRINTF("Bad PCIR offset 0x%x or signature\n", pcir_offset);
+        return;
+    }
+
+    vendor_id = pci_get_word(pdev->config + PCI_VENDOR_ID);
+    device_id = pci_get_word(pdev->config + PCI_DEVICE_ID);
+    rom_vendor_id = pci_get_word(ptr + pcir_offset + 4);
+    rom_device_id = pci_get_word(ptr + pcir_offset + 6);
+
+    PCI_DPRINTF("%s: ROM id %04x%04x / PCI id %04x%04x\n", pdev->romfile,
+                vendor_id, device_id, rom_vendor_id, rom_device_id);
+
+    checksum = ptr[6];
+
+    if (vendor_id != rom_vendor_id) {
+        /* Patch vendor id and checksum (at offset 6 for etherboot roms). */
+        checksum += (uint8_t)rom_vendor_id + (uint8_t)(rom_vendor_id >> 8);
+        checksum -= (uint8_t)vendor_id + (uint8_t)(vendor_id >> 8);
+        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
+        ptr[6] = checksum;
+        pci_set_word(ptr + pcir_offset + 4, vendor_id);
+    }
+
+    if (device_id != rom_device_id) {
+        /* Patch device id and checksum (at offset 6 for etherboot roms). */
+        checksum += (uint8_t)rom_device_id + (uint8_t)(rom_device_id >> 8);
+        checksum -= (uint8_t)device_id + (uint8_t)(device_id >> 8);
+        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
+        ptr[6] = checksum;
+        pci_set_word(ptr + pcir_offset + 6, device_id);
+    }
+}
+
 /* Add an option rom for the device */
-static int pci_add_option_rom(PCIDevice *pdev)
+static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom)
 {
     int size;
     char *path;
@@ -1849,6 +1909,11 @@ static int pci_add_option_rom(PCIDevice *pdev)
     load_image(path, ptr);
     qemu_free(path);
 
+    if (is_default_rom) {
+        /* Only the default rom images will be patched (if needed). */
+        pci_patch_ids(pdev, ptr, size);
+    }
+
     pci_register_bar(pdev, PCI_ROM_SLOT, size,
                      0, pci_map_option_rom);
 
-- 
1.7.1

^ permalink raw reply related	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-19  8:37                           ` Michael S. Tsirkin
@ 2010-10-19 21:15                             ` Stefan Weil
  2010-10-19 21:22                               ` Anthony Liguori
  0 siblings, 1 reply; 43+ messages in thread
From: Stefan Weil @ 2010-10-19 21:15 UTC (permalink / raw)
  To: Michael S. Tsirkin; +Cc: QEMU Developers, Markus Armbruster, Gerd Hoffmann

Am 19.10.2010 10:37, schrieb Michael S. Tsirkin:
> On Mon, Oct 18, 2010 at 09:11:55PM +0200, Stefan Weil wrote:
>> QEMU must only make sure that patching of the supported roms
>> with supported devices work.
>
> I think that's what Anthony was saying too - make this depend
> on a qdev property and set it only in eepro100 for now.
>

My new patch v3 implements something similar and does not need
a new qdev property:

Don't patch because the rom file was defined by the user:

qemu -L pc-bios -boot n -netdev user,id=internet \
     -device i82801,netdev=internet,romfile=gpxe-eepro100-80861209.rom

Patch because we work with the built-in default rom file:

qemu -L pc-bios -boot n -netdev user,id=internet \
     -device i82801,netdev=internet

This is a safe solution which respects user's rom data
without adding much more complexity.

Regards,
Stefan

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-19 21:15                             ` Stefan Weil
@ 2010-10-19 21:22                               ` Anthony Liguori
  2010-10-19 21:25                                 ` Michael S. Tsirkin
  0 siblings, 1 reply; 43+ messages in thread
From: Anthony Liguori @ 2010-10-19 21:22 UTC (permalink / raw)
  To: Stefan Weil
  Cc: QEMU Developers, Gerd Hoffmann, Markus Armbruster, Michael S. Tsirkin

On 10/19/2010 04:15 PM, Stefan Weil wrote:
> Am 19.10.2010 10:37, schrieb Michael S. Tsirkin:
>> On Mon, Oct 18, 2010 at 09:11:55PM +0200, Stefan Weil wrote:
>>> QEMU must only make sure that patching of the supported roms
>>> with supported devices work.
>>
>> I think that's what Anthony was saying too - make this depend
>> on a qdev property and set it only in eepro100 for now.
>>
>
> My new patch v3 implements something similar and does not need
> a new qdev property:

I prefer to have an explicit property in case a user actually wants to 
use this functionality.   That said, if Michael's happy with the 
approach, I'm okay with it too.

Regards,

Anthony Liguori

> Don't patch because the rom file was defined by the user:
>
> qemu -L pc-bios -boot n -netdev user,id=internet \
>     -device i82801,netdev=internet,romfile=gpxe-eepro100-80861209.rom
>
> Patch because we work with the built-in default rom file:
>
> qemu -L pc-bios -boot n -netdev user,id=internet \
>     -device i82801,netdev=internet
>
> This is a safe solution which respects user's rom data
> without adding much more complexity.
>
> Regards,
> Stefan
>

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-19 21:22                               ` Anthony Liguori
@ 2010-10-19 21:25                                 ` Michael S. Tsirkin
  0 siblings, 0 replies; 43+ messages in thread
From: Michael S. Tsirkin @ 2010-10-19 21:25 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: QEMU Developers, Markus Armbruster, Gerd Hoffmann

On Tue, Oct 19, 2010 at 04:22:23PM -0500, Anthony Liguori wrote:
> On 10/19/2010 04:15 PM, Stefan Weil wrote:
> >Am 19.10.2010 10:37, schrieb Michael S. Tsirkin:
> >>On Mon, Oct 18, 2010 at 09:11:55PM +0200, Stefan Weil wrote:
> >>>QEMU must only make sure that patching of the supported roms
> >>>with supported devices work.
> >>
> >>I think that's what Anthony was saying too - make this depend
> >>on a qdev property and set it only in eepro100 for now.
> >>
> >
> >My new patch v3 implements something similar and does not need
> >a new qdev property:
> 
> I prefer to have an explicit property in case a user actually wants
> to use this functionality.   That said, if Michael's happy with the
> approach, I'm okay with it too.
> 
> Regards,
> 
> Anthony Liguori

I currently feel kind of the same, just to make this explicit ...
if you like, let me sleep on it.

> >Don't patch because the rom file was defined by the user:
> >
> >qemu -L pc-bios -boot n -netdev user,id=internet \
> >    -device i82801,netdev=internet,romfile=gpxe-eepro100-80861209.rom
> >
> >Patch because we work with the built-in default rom file:
> >
> >qemu -L pc-bios -boot n -netdev user,id=internet \
> >    -device i82801,netdev=internet
> >
> >This is a safe solution which respects user's rom data
> >without adding much more complexity.
> >
> >Regards,
> >Stefan
> >

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] Re: [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-19 21:08                         ` Stefan Weil
@ 2010-10-20  7:19                           ` Gerd Hoffmann
  2010-10-20 20:30                             ` Stefan Weil
  2010-11-22  6:29                           ` Michael S. Tsirkin
  1 sibling, 1 reply; 43+ messages in thread
From: Gerd Hoffmann @ 2010-10-20  7:19 UTC (permalink / raw)
  To: Stefan Weil; +Cc: Michael S. Tsirkin, QEMU Developers, Markus Armbruster

   Hi,

> The i825xx ethernet controller family is a typical example
> which is implemented in hw/eepro100.c. It uses at least
> 3 different device ids, so normally 3 boot roms would be needed.

Does this actually work now with the etherboot roms?

cheers,
   Gerd

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] Re: [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-20  7:19                           ` [Qemu-devel] " Gerd Hoffmann
@ 2010-10-20 20:30                             ` Stefan Weil
  0 siblings, 0 replies; 43+ messages in thread
From: Stefan Weil @ 2010-10-20 20:30 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Michael S. Tsirkin, QEMU Developers, Markus Armbruster

Am 20.10.2010 09:19, schrieb Gerd Hoffmann:
>   Hi,
>
>> The i825xx ethernet controller family is a typical example
>> which is implemented in hw/eepro100.c. It uses at least
>> 3 different device ids, so normally 3 boot roms would be needed.
>
> Does this actually work now with the etherboot roms?
>
> cheers,
>   Gerd


Yes. I tested these two cases:

qemu -L pc-bios -boot n -netdev user,id=internet \
     -device i82801,netdev=internet,romfile=gpxe-eepro100-80861209.rom

=> no bootable device

qemu -L pc-bios -boot n -netdev user,id=internet \
     -device i82801,netdev=internet

=> device gets ip address via dhcp

The same works with i82559c or other eepro100 variants, too.

Cheers,
Stefan

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [SeaBIOS] [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-18 18:39           ` Anthony Liguori
@ 2010-10-21 10:09             ` Avi Kivity
  2010-10-21 13:14               ` Anthony Liguori
  0 siblings, 1 reply; 43+ messages in thread
From: Avi Kivity @ 2010-10-21 10:09 UTC (permalink / raw)
  To: Anthony Liguori
  Cc: Kevin Wolf, Michael S. Tsirkin, seabios, Markus Armbruster,
	QEMU Developers, Gerd Hoffmann

  On 10/18/2010 08:39 PM, Anthony Liguori wrote:
>> SeaBIOS rejects them when loaded from the rom bar and doesn't reject 
>> them when loaded via fw_cfg.
>
>
> What I meant was, rombar=0 in qdev.  Sometimes my fingers don't work 
> the same way my brain does :-)


Are you using qmp or the human monitor protocol?

-- 
error compiling committee.c: too many arguments to function

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [SeaBIOS] [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-21 10:09             ` [SeaBIOS] " Avi Kivity
@ 2010-10-21 13:14               ` Anthony Liguori
  2010-10-21 15:34                 ` Avi Kivity
  0 siblings, 1 reply; 43+ messages in thread
From: Anthony Liguori @ 2010-10-21 13:14 UTC (permalink / raw)
  To: Avi Kivity
  Cc: Kevin Wolf, Michael S. Tsirkin, seabios, Markus Armbruster,
	QEMU Developers, Gerd Hoffmann

On 10/21/2010 05:09 AM, Avi Kivity wrote:
>  On 10/18/2010 08:39 PM, Anthony Liguori wrote:
>>> SeaBIOS rejects them when loaded from the rom bar and doesn't reject 
>>> them when loaded via fw_cfg.
>>
>>
>> What I meant was, rombar=0 in qdev.  Sometimes my fingers don't work 
>> the same way my brain does :-)
>
>
> Are you using qmp or the human monitor protocol?

I'm still running on a DCE/RPC implementation from the early 80s.

Regards,

Anthony Liguori

^ permalink raw reply	[flat|nested] 43+ messages in thread

* Re: [SeaBIOS] [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM
  2010-10-21 13:14               ` Anthony Liguori
@ 2010-10-21 15:34                 ` Avi Kivity
  0 siblings, 0 replies; 43+ messages in thread
From: Avi Kivity @ 2010-10-21 15:34 UTC (permalink / raw)
  To: Anthony Liguori
  Cc: Kevin Wolf, Michael S. Tsirkin, seabios, QEMU Developers,
	Markus Armbruster

  On 10/21/2010 03:14 PM, Anthony Liguori wrote:
> On 10/21/2010 05:09 AM, Avi Kivity wrote:
>>  On 10/18/2010 08:39 PM, Anthony Liguori wrote:
>>>> SeaBIOS rejects them when loaded from the rom bar and doesn't 
>>>> reject them when loaded via fw_cfg.
>>>
>>>
>>> What I meant was, rombar=0 in qdev.  Sometimes my fingers don't work 
>>> the same way my brain does :-)
>>
>>
>> Are you using qmp or the human monitor protocol?
>
> I'm still running on a DCE/RPC implementation from the early 80s.
>

Well, I hope you keep it up to date.  I wouldn't want a vulnerability 
inserted into qemu by an attacker controlling a maintainer's hands.

-- 
error compiling committee.c: too many arguments to function

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] Re: Where's gpxe-eepro100-80862449.rom ?
  2010-10-15 21:03     ` [Qemu-devel] Re: Where's gpxe-eepro100-80862449.rom ? Stefan Weil
@ 2010-10-25 12:11       ` Markus Armbruster
  2010-10-25 16:23         ` Stefan Weil
  0 siblings, 1 reply; 43+ messages in thread
From: Markus Armbruster @ 2010-10-25 12:11 UTC (permalink / raw)
  To: Stefan Weil; +Cc: qemu-devel

Stefan Weil <weil@mail.berlios.de> writes:

> Am 13.10.2010 09:13, schrieb Markus Armbruster:
>> Stefan Weil<weil@mail.berlios.de>  writes:
[...]
>>> Do you think there is urgent need for a gpxe-eepro100-80862449.rom binary?
>>>      
>> Well, "-device i82801" complains because it misses this binary.  Do we
>> want to ship that way?
>>    
>
> I just sent two patches which create the rom data on load.
> So -device i82801 no longer complains but gets the boot
> information from dhcp (tested with i386-softmmu).
>
> Your build tree will be made smaller by at least 50 KB :-)
>
> Do you think these patches should be added to stable-0.13, too?

If the gain for "-device i82801" is worth the risk, which depends on the
patch.  Have we reached consensus on how to fix it in master?

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] Re: Where's gpxe-eepro100-80862449.rom ?
  2010-10-25 12:11       ` Markus Armbruster
@ 2010-10-25 16:23         ` Stefan Weil
  2010-10-25 16:54           ` Michael S. Tsirkin
  0 siblings, 1 reply; 43+ messages in thread
From: Stefan Weil @ 2010-10-25 16:23 UTC (permalink / raw)
  To: Markus Armbruster; +Cc: qemu-devel, Michael S. Tsirkin

Am 25.10.2010 14:11, schrieb Markus Armbruster:
> Stefan Weil <weil@mail.berlios.de> writes:
>
>> Am 13.10.2010 09:13, schrieb Markus Armbruster:
>>> Stefan Weil<weil@mail.berlios.de> writes:
> [...]
>>>> Do you think there is urgent need for a gpxe-eepro100-80862449.rom 
>>>> binary?
>>>>
>>> Well, "-device i82801" complains because it misses this binary. Do we
>>> want to ship that way?
>>>
>>
>> I just sent two patches which create the rom data on load.
>> So -device i82801 no longer complains but gets the boot
>> information from dhcp (tested with i386-softmmu).
>>
>> Your build tree will be made smaller by at least 50 KB :-)
>>
>> Do you think these patches should be added to stable-0.13, too?
>
> If the gain for "-device i82801" is worth the risk, which depends on the
> patch. Have we reached consensus on how to fix it in master?


The latest patch version fixes rom data only for the default
roms, so the risk is minimized and full tests are possible.

There is still no consensus whether we need a new qdev property
(which allows users to have their rom data fixed, too) or not.

My patch does not prevent adding that new qdev property,
so I suggest applying my patch now and adding the property
later (if it is ever needed).

Regards
Stefan

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] Re: Where's gpxe-eepro100-80862449.rom ?
  2010-10-25 16:23         ` Stefan Weil
@ 2010-10-25 16:54           ` Michael S. Tsirkin
  2010-11-15 17:06             ` Stefan Weil
  0 siblings, 1 reply; 43+ messages in thread
From: Michael S. Tsirkin @ 2010-10-25 16:54 UTC (permalink / raw)
  To: Stefan Weil; +Cc: Markus Armbruster, qemu-devel

On Mon, Oct 25, 2010 at 06:23:24PM +0200, Stefan Weil wrote:
> Am 25.10.2010 14:11, schrieb Markus Armbruster:
> >Stefan Weil <weil@mail.berlios.de> writes:
> >
> >>Am 13.10.2010 09:13, schrieb Markus Armbruster:
> >>>Stefan Weil<weil@mail.berlios.de> writes:
> >[...]
> >>>>Do you think there is urgent need for a
> >>>>gpxe-eepro100-80862449.rom binary?
> >>>>
> >>>Well, "-device i82801" complains because it misses this binary. Do we
> >>>want to ship that way?
> >>>
> >>
> >>I just sent two patches which create the rom data on load.
> >>So -device i82801 no longer complains but gets the boot
> >>information from dhcp (tested with i386-softmmu).
> >>
> >>Your build tree will be made smaller by at least 50 KB :-)
> >>
> >>Do you think these patches should be added to stable-0.13, too?
> >
> >If the gain for "-device i82801" is worth the risk, which depends on the
> >patch. Have we reached consensus on how to fix it in master?
> 
> 
> The latest patch version fixes rom data only for the default
> roms, so the risk is minimized and full tests are possible.
> 
> There is still no consensus whether we need a new qdev property
> (which allows users to have their rom data fixed, too) or not.
> 
> My patch does not prevent adding that new qdev property,
> so I suggest applying my patch now and adding the property
> later (if it is ever needed).
> 
> Regards
> Stefan

Fair enough, I guess.

-- 
MST

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] Re: Where's gpxe-eepro100-80862449.rom ?
  2010-10-25 16:54           ` Michael S. Tsirkin
@ 2010-11-15 17:06             ` Stefan Weil
  0 siblings, 0 replies; 43+ messages in thread
From: Stefan Weil @ 2010-11-15 17:06 UTC (permalink / raw)
  To: Anthony Liguori; +Cc: Michael S. Tsirkin, Markus Armbruster, qemu-devel

Am 25.10.2010 18:54, schrieb Michael S. Tsirkin:
> On Mon, Oct 25, 2010 at 06:23:24PM +0200, Stefan Weil wrote:
>    
>> Am 25.10.2010 14:11, schrieb Markus Armbruster:
>>      
>>> Stefan Weil<weil@mail.berlios.de>  writes:
>>>
>>>        
>>>> Am 13.10.2010 09:13, schrieb Markus Armbruster:
>>>>          
>>>>> Stefan Weil<weil@mail.berlios.de>  writes:
>>>>>            
>>> [...]
>>>        
>>>>>> Do you think there is urgent need for a
>>>>>> gpxe-eepro100-80862449.rom binary?
>>>>>>
>>>>>>              
>>>>> Well, "-device i82801" complains because it misses this binary. Do we
>>>>> want to ship that way?
>>>>>
>>>>>            
>>>> I just sent two patches which create the rom data on load.
>>>> So -device i82801 no longer complains but gets the boot
>>>> information from dhcp (tested with i386-softmmu).
>>>>
>>>> Your build tree will be made smaller by at least 50 KB :-)
>>>>
>>>> Do you think these patches should be added to stable-0.13, too?
>>>>          
>>> If the gain for "-device i82801" is worth the risk, which depends on the
>>> patch. Have we reached consensus on how to fix it in master?
>>>        
>>
>> The latest patch version fixes rom data only for the default
>> roms, so the risk is minimized and full tests are possible.
>>
>> There is still no consensus whether we need a new qdev property
>> (which allows users to have their rom data fixed, too) or not.
>>
>> My patch does not prevent adding that new qdev property,
>> so I suggest applying my patch now and adding the property
>> later (if it is ever needed).
>>
>> Regards
>> Stefan
>>      
> Fair enough, I guess.
>    

So is there consensus that both patches can be committed to qemu master?

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] Re: [PATCH 1/2] pci: Automatically patch PCI vendor id and device id in PCI ROM
  2010-10-19 21:08                         ` Stefan Weil
  2010-10-20  7:19                           ` [Qemu-devel] " Gerd Hoffmann
@ 2010-11-22  6:29                           ` Michael S. Tsirkin
  1 sibling, 0 replies; 43+ messages in thread
From: Michael S. Tsirkin @ 2010-11-22  6:29 UTC (permalink / raw)
  To: Stefan Weil; +Cc: Markus Armbruster, QEMU Developers, Gerd Hoffmann

On Tue, Oct 19, 2010 at 11:08:21PM +0200, Stefan Weil wrote:
> PCI devices with different vendor or device ids sometimes share
> the same rom code. Only the ids and the checksum
> differs in a boot rom for such devices.
> 
> The i825xx ethernet controller family is a typical example
> which is implemented in hw/eepro100.c. It uses at least
> 3 different device ids, so normally 3 boot roms would be needed.
> 
> By automatically patching vendor id and device id (and the checksum)
> in qemu, all emulated family members can share the same boot rom.
> 
> VGA bios roms are another example with different vendor and device ids.
> 
> Only qemu's built-in default rom files will be patched.
> 
> v2:
>     * Patch also the vendor id (and remove the sanity check for vendor id).
> 
> v3:
>     * Don't patch a rom file when its name was set by the user.
>       Thus we avoid modifications of unknown rom data.
> 
> Cc: Gerd Hoffmann <kraxel@redhat.com>
> Cc: Markus Armbruster <armbru@redhat.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Stefan Weil <weil@mail.berlios.de>

Looks safe enough for me.
Applied.

> ---
>  hw/pci.c |   73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
>  1 files changed, 69 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/pci.c b/hw/pci.c
> index 1280d4d..74cbea5 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -78,7 +78,7 @@ static struct BusInfo pci_bus_info = {
>  
>  static void pci_update_mappings(PCIDevice *d);
>  static void pci_set_irq(void *opaque, int irq_num, int level);
> -static int pci_add_option_rom(PCIDevice *pdev);
> +static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom);
>  static void pci_del_option_rom(PCIDevice *pdev);
>  
>  static uint16_t pci_default_sub_vendor_id = PCI_SUBVENDOR_ID_REDHAT_QUMRANET;
> @@ -1672,6 +1672,7 @@ static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
>      PCIDeviceInfo *info = container_of(base, PCIDeviceInfo, qdev);
>      PCIBus *bus;
>      int devfn, rc;
> +    bool is_default_rom;
>  
>      /* initialize cap_present for pci_is_express() and pci_config_size() */
>      if (info->is_express) {
> @@ -1692,9 +1693,12 @@ static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
>      }
>  
>      /* rom loading */
> -    if (pci_dev->romfile == NULL && info->romfile != NULL)
> +    is_default_rom = false;
> +    if (pci_dev->romfile == NULL && info->romfile != NULL) {
>          pci_dev->romfile = qemu_strdup(info->romfile);
> -    pci_add_option_rom(pci_dev);
> +        is_default_rom = true;
> +    }
> +    pci_add_option_rom(pci_dev, is_default_rom);
>  
>      if (qdev->hotplugged) {
>          rc = bus->hotplug(bus->hotplug_qdev, pci_dev, 1);
> @@ -1797,8 +1801,64 @@ static void pci_map_option_rom(PCIDevice *pdev, int region_num, pcibus_t addr, p
>      cpu_register_physical_memory(addr, size, pdev->rom_offset);
>  }
>  
> +/* Patch the PCI vendor and device ids in a PCI rom image if necessary.
> +   This is needed for an option rom which is used for more than one device. */
> +static void pci_patch_ids(PCIDevice *pdev, uint8_t *ptr, int size)
> +{
> +    uint16_t vendor_id;
> +    uint16_t device_id;
> +    uint16_t rom_vendor_id;
> +    uint16_t rom_device_id;
> +    uint16_t rom_magic;
> +    uint16_t pcir_offset;
> +    uint8_t checksum;
> +
> +    /* Words in rom data are little endian (like in PCI configuration),
> +       so they can be read / written with pci_get_word / pci_set_word. */
> +
> +    /* Only a valid rom will be patched. */
> +    rom_magic = pci_get_word(ptr);
> +    if (rom_magic != 0xaa55) {
> +        PCI_DPRINTF("Bad ROM magic %04x\n", rom_magic);
> +        return;
> +    }
> +    pcir_offset = pci_get_word(ptr + 0x18);
> +    if (pcir_offset + 8 >= size || memcmp(ptr + pcir_offset, "PCIR", 4)) {
> +        PCI_DPRINTF("Bad PCIR offset 0x%x or signature\n", pcir_offset);
> +        return;
> +    }
> +
> +    vendor_id = pci_get_word(pdev->config + PCI_VENDOR_ID);
> +    device_id = pci_get_word(pdev->config + PCI_DEVICE_ID);
> +    rom_vendor_id = pci_get_word(ptr + pcir_offset + 4);
> +    rom_device_id = pci_get_word(ptr + pcir_offset + 6);
> +
> +    PCI_DPRINTF("%s: ROM id %04x%04x / PCI id %04x%04x\n", pdev->romfile,
> +                vendor_id, device_id, rom_vendor_id, rom_device_id);
> +
> +    checksum = ptr[6];
> +
> +    if (vendor_id != rom_vendor_id) {
> +        /* Patch vendor id and checksum (at offset 6 for etherboot roms). */
> +        checksum += (uint8_t)rom_vendor_id + (uint8_t)(rom_vendor_id >> 8);
> +        checksum -= (uint8_t)vendor_id + (uint8_t)(vendor_id >> 8);
> +        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
> +        ptr[6] = checksum;
> +        pci_set_word(ptr + pcir_offset + 4, vendor_id);
> +    }
> +
> +    if (device_id != rom_device_id) {
> +        /* Patch device id and checksum (at offset 6 for etherboot roms). */
> +        checksum += (uint8_t)rom_device_id + (uint8_t)(rom_device_id >> 8);
> +        checksum -= (uint8_t)device_id + (uint8_t)(device_id >> 8);
> +        PCI_DPRINTF("ROM checksum %02x / %02x\n", ptr[6], checksum);
> +        ptr[6] = checksum;
> +        pci_set_word(ptr + pcir_offset + 6, device_id);
> +    }
> +}
> +
>  /* Add an option rom for the device */
> -static int pci_add_option_rom(PCIDevice *pdev)
> +static int pci_add_option_rom(PCIDevice *pdev, bool is_default_rom)
>  {
>      int size;
>      char *path;
> @@ -1849,6 +1909,11 @@ static int pci_add_option_rom(PCIDevice *pdev)
>      load_image(path, ptr);
>      qemu_free(path);
>  
> +    if (is_default_rom) {
> +        /* Only the default rom images will be patched (if needed). */
> +        pci_patch_ids(pdev, ptr, size);
> +    }
> +
>      pci_register_bar(pdev, PCI_ROM_SLOT, size,
>                       0, pci_map_option_rom);
>  
> -- 
> 1.7.1

^ permalink raw reply	[flat|nested] 43+ messages in thread

* [Qemu-devel] Re: [PATCH 2/2] eepro100: Use a single rom file for all i825xx devices
  2010-10-15 20:51     ` [Qemu-devel] [PATCH 2/2] eepro100: Use a single rom file for all i825xx devices Stefan Weil
@ 2010-11-22  6:29       ` Michael S. Tsirkin
  0 siblings, 0 replies; 43+ messages in thread
From: Michael S. Tsirkin @ 2010-11-22  6:29 UTC (permalink / raw)
  To: Stefan Weil; +Cc: QEMU Developers, Markus Armbruster

On Fri, Oct 15, 2010 at 10:51:07PM +0200, Stefan Weil wrote:
> Patching the rom data during load (in qemu) now
> also supports i82801 (which had no rom file).
> 
> We only need a single rom file for the whole device family,
> so remove the second one which is no longer needed.
> 
> Cc: Markus Armbruster <armbru@redhat.com>
> Cc: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Stefan Weil <weil@mail.berlios.de>


Applied, thanks.

> ---
>  Makefile                           |    1 -
>  hw/eepro100.c                      |   14 +++-----------
>  pc-bios/README                     |    2 +-
>  pc-bios/gpxe-eepro100-80861229.rom |  Bin 56832 -> 0 bytes
>  4 files changed, 4 insertions(+), 13 deletions(-)
>  delete mode 100644 pc-bios/gpxe-eepro100-80861229.rom
> 
> diff --git a/Makefile b/Makefile
> index 252c817..b5f6ba4 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -178,7 +178,6 @@ ifdef INSTALL_BLOBS
>  BLOBS=bios.bin vgabios.bin vgabios-cirrus.bin ppc_rom.bin \
>  openbios-sparc32 openbios-sparc64 openbios-ppc \
>  gpxe-eepro100-80861209.rom \
> -gpxe-eepro100-80861229.rom \
>  pxe-e1000.bin \
>  pxe-ne2k_pci.bin pxe-pcnet.bin \
>  pxe-rtl8139.bin pxe-virtio.bin \
> diff --git a/hw/eepro100.c b/hw/eepro100.c
> index 218472d..5835b5a 100644
> --- a/hw/eepro100.c
> +++ b/hw/eepro100.c
> @@ -2048,17 +2048,9 @@ static void eepro100_register_devices(void)
>      size_t i;
>      for (i = 0; i < ARRAY_SIZE(e100_devices); i++) {
>          PCIDeviceInfo *pci_dev = &e100_devices[i].pci;
> -        switch (e100_devices[i].device_id) {
> -            case PCI_DEVICE_ID_INTEL_82551IT:
> -                pci_dev->romfile = "gpxe-eepro100-80861209.rom";
> -                break;
> -            case PCI_DEVICE_ID_INTEL_82557:
> -                pci_dev->romfile = "gpxe-eepro100-80861229.rom";
> -                break;
> -            case 0x2449:
> -                pci_dev->romfile = "gpxe-eepro100-80862449.rom";
> -                break;
> -        }
> +        /* We use the same rom file for all device ids.
> +           QEMU fixes the device id during rom load. */
> +        pci_dev->romfile = "gpxe-eepro100-80861209.rom";
>          pci_dev->init = e100_nic_init;
>          pci_dev->exit = pci_nic_uninit;
>          pci_dev->qdev.props = e100_properties;
> diff --git a/pc-bios/README b/pc-bios/README
> index 3172cf7..4b019e0 100644
> --- a/pc-bios/README
> +++ b/pc-bios/README
> @@ -16,7 +16,7 @@
>  - The PXE roms come from Rom-o-Matic gPXE 0.9.9 with BANNER_TIMEOUT=0
>  
>    e1000 8086:100E
> -  eepro100 8086:1209, 8086:1229
> +  eepro100 8086:1209 (also used for 8086:1229 and 8086:2449)
>    ns8390 1050:0940
>    pcnet32 1022:2000
>    rtl8139 10ec:8139
> diff --git a/pc-bios/gpxe-eepro100-80861229.rom b/pc-bios/gpxe-eepro100-80861229.rom
> deleted file mode 100644
> index 9cf397e3de03c4b6441893cf07d9ea63a36a65c8..0000000000000000000000000000000000000000
> GIT binary patch
> literal 0
> HcmV?d00001
> 
> literal 56832
> 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
> 
> -- 
> 1.7.1

^ permalink raw reply	[flat|nested] 43+ messages in thread

end of thread, other threads:[~2010-11-22  6:29 UTC | newest]

Thread overview: 43+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-10-12 12:41 [Qemu-devel] Where's gpxe-eepro100-80862449.rom ? Markus Armbruster
2010-10-12 16:18 ` [Qemu-devel] " Stefan Weil
2010-10-13  7:13   ` Markus Armbruster
2010-10-15 20:51     ` [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI device id in PCI ROM Stefan Weil
2010-10-15 21:05       ` Anthony Liguori
2010-10-18 10:09         ` Gerd Hoffmann
2010-10-18 18:39           ` Anthony Liguori
2010-10-21 10:09             ` [SeaBIOS] " Avi Kivity
2010-10-21 13:14               ` Anthony Liguori
2010-10-21 15:34                 ` Avi Kivity
2010-10-18 10:04       ` Gerd Hoffmann
2010-10-18 11:16         ` Stefan Weil
2010-10-18 11:54           ` Gerd Hoffmann
2010-10-18 13:16             ` Stefan Weil
2010-10-18 13:30               ` Gerd Hoffmann
2010-10-18 15:50                 ` Gerd Hoffmann
2010-10-18 17:54                   ` Stefan Weil
2010-10-18 17:55                   ` [Qemu-devel] [PATCH 1/2] pci: Automatically patch PCI vendor id and " Stefan Weil
2010-10-18 17:58                     ` [Qemu-devel] " Michael S. Tsirkin
2010-10-18 18:42                       ` Anthony Liguori
2010-10-18 19:03                         ` Michael S. Tsirkin
2010-10-18 19:36                           ` Stefan Weil
2010-10-18 19:59                             ` Anthony Liguori
2010-10-19  6:40                             ` Gerd Hoffmann
2010-10-18 19:56                           ` Anthony Liguori
2010-10-18 18:44                     ` [Qemu-devel] " Anthony Liguori
2010-10-18 18:53                       ` Anthony Liguori
2010-10-18 19:11                         ` Stefan Weil
2010-10-19  8:37                           ` Michael S. Tsirkin
2010-10-19 21:15                             ` Stefan Weil
2010-10-19 21:22                               ` Anthony Liguori
2010-10-19 21:25                                 ` Michael S. Tsirkin
2010-10-19 21:08                         ` Stefan Weil
2010-10-20  7:19                           ` [Qemu-devel] " Gerd Hoffmann
2010-10-20 20:30                             ` Stefan Weil
2010-11-22  6:29                           ` Michael S. Tsirkin
2010-10-15 20:51     ` [Qemu-devel] [PATCH 2/2] eepro100: Use a single rom file for all i825xx devices Stefan Weil
2010-11-22  6:29       ` [Qemu-devel] " Michael S. Tsirkin
2010-10-15 21:03     ` [Qemu-devel] Re: Where's gpxe-eepro100-80862449.rom ? Stefan Weil
2010-10-25 12:11       ` Markus Armbruster
2010-10-25 16:23         ` Stefan Weil
2010-10-25 16:54           ` Michael S. Tsirkin
2010-11-15 17:06             ` Stefan Weil

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.