[ipxe-devel] [PATCH] [rom] Correct invalid base-class/sub-class/prog-if order in PCIR

Petr Borsodi petr.borsodi at gmail.com
Mon Jan 14 14:56:26 UTC 2019


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.
---
src/arch/x86/prefix/mromprefix.S | 2 +-
src/arch/x86/prefix/romprefix.S | 2 +-
src/util/Option/ROM.pm | 4 ++--
src/util/efirom.c | 2 +-
4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/arch/x86/prefix/mromprefix.S 
b/src/arch/x86/prefix/mromprefix.S
index 73a869d9..2b5c6bf6 100644
--- a/src/arch/x86/prefix/mromprefix.S
+++ b/src/arch/x86/prefix/mromprefix.S
@@ -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 */
diff --git a/src/arch/x86/prefix/romprefix.S 
b/src/arch/x86/prefix/romprefix.S
index 978b07b5..3abef0ea 100644
--- a/src/arch/x86/prefix/romprefix.S
+++ b/src/arch/x86/prefix/romprefix.S
@@ -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 */
diff --git a/src/util/Option/ROM.pm b/src/util/Option/ROM.pm
index 232cf16b..48d92dda 100644
--- a/src/util/Option/ROM.pm
+++ b/src/util/Option/ROM.pm
@@ -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" },
diff --git a/src/util/efirom.c b/src/util/efirom.c
index 943a6691..93cd79fe 100644
--- a/src/util/efirom.c
+++ b/src/util/efirom.c
@@ -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? */
-- 
2.20.1.windows.1





More information about the ipxe-devel mailing list