From ba0d5aa993df4bad28b2a6a36c10b43c7e5c33f2 Mon Sep 17 00:00:00 2001 From: Petr Borsodi Date: Tue, 15 Jan 2019 13:06:19 +0000 Subject: [pci] Correct invalid base-class/sub-class/prog-if order in PCIR 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 --- 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? */ -- cgit v1.2.3-55-g7522