]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[pci] Correct invalid base-class/sub-class/prog-if order in PCIR
authorPetr Borsodi <petr.borsodi@gmail.com>
Tue, 15 Jan 2019 13:06:19 +0000 (13:06 +0000)
committerMichael Brown <mcb30@ipxe.org>
Tue, 15 Jan 2019 13:08:44 +0000 (13:08 +0000)
PCI Configuration Space contains fields prog-if at the offset 0x09,
sub-class at the offset 0x0a and base-class at the offset 0x0b (it
respects little endian).  PCIR structure uses these fields in the same
order.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/x86/prefix/mromprefix.S
src/arch/x86/prefix/romprefix.S
src/util/Option/ROM.pm
src/util/efirom.c

index 73a869d909775925dd899f38b380e8fce4ee0ff6..2b5c6bf64825c265bdfce7f0ca30827c57b49c7b 100644 (file)
@@ -500,7 +500,7 @@ mpciheader:
        .word   0x0000                  /* Device list pointer */
        .word   mpciheader_len          /* PCI data structure length */
        .byte   0x03                    /* PCI data structure revision */
-       .byte   0x02, 0x00, 0x00        /* Class code */
+       .byte   0x00, 0x00, 0x02        /* Class code */
 mpciheader_image_length:
        .word   0                       /* Image length */
        .word   0x0001                  /* Revision level */
index 978b07b57ba5cf004262b9ecf44ccd04e73e1e18..3abef0eaf734f45303b9ca61f91e610b08b1d431 100644 (file)
@@ -96,7 +96,7 @@ pciheader:
        .word   ( pci_devlist - pciheader ) /* Device list pointer */
        .word   pciheader_len           /* PCI data structure length */
        .byte   0x03                    /* PCI data structure revision */
-       .byte   0x02, 0x00, 0x00        /* Class code */
+       .byte   0x00, 0x00, 0x02        /* Class code */
 pciheader_image_length:
        .word   0                       /* Image length */
        .word   0x0001                  /* Revision level */
index 232cf16b8355ad419ffbbcab9e6e4e1fbd3d94a1..48d92dda009b3ae32daedc3ebac233f3631421a7 100644 (file)
@@ -508,9 +508,9 @@ sub new {
       device_list =>   { offset => 0x08, length => 0x02, pack => "S" },
       struct_length => { offset => 0x0a, length => 0x02, pack => "S" },
       struct_revision =>{ offset => 0x0c, length => 0x01, pack => "C" },
-      base_class =>    { offset => 0x0d, length => 0x01, pack => "C" },
+      prog_intf =>     { offset => 0x0d, length => 0x01, pack => "C" },
       sub_class =>     { offset => 0x0e, length => 0x01, pack => "C" },
-      prog_intf =>     { offset => 0x0f, length => 0x01, pack => "C" },
+      base_class =>    { offset => 0x0f, length => 0x01, pack => "C" },
       image_length =>  { offset => 0x10, length => 0x02, pack => "S" },
       revision =>      { offset => 0x12, length => 0x02, pack => "S" },
       code_type =>     { offset => 0x14, length => 0x01, pack => "C" },
index 943a669101eabcda1a1ef11d44fbf29b5ed212ae..93cd79fe9deb3fd1ec7e49c294e6e2dbca7253d6 100644 (file)
@@ -149,7 +149,7 @@ static void make_efi_rom ( FILE *pe, FILE *rom, struct options *opts ) {
        headers->pci.VendorId = opts->vendor;
        headers->pci.DeviceId = opts->device;
        headers->pci.Length = sizeof ( headers->pci );
-       headers->pci.ClassCode[0] = PCI_CLASS_NETWORK;
+       headers->pci.ClassCode[2] = PCI_CLASS_NETWORK;
        headers->pci.ImageLength = ( rom_size / 512 );
        headers->pci.CodeType = 0x03; /* No constant in EFI headers? */
        headers->pci.Indicator = 0x80; /* No constant in EFI headers? */