aboutsummaryrefslogtreecommitdiffstats
path: root/Lesson_32/UefiLessonsPkg/DumpPCIroms/DumpPCIroms.c
diff options
context:
space:
mode:
Diffstat (limited to 'Lesson_32/UefiLessonsPkg/DumpPCIroms/DumpPCIroms.c')
-rw-r--r--Lesson_32/UefiLessonsPkg/DumpPCIroms/DumpPCIroms.c248
1 files changed, 126 insertions, 122 deletions
diff --git a/Lesson_32/UefiLessonsPkg/DumpPCIroms/DumpPCIroms.c b/Lesson_32/UefiLessonsPkg/DumpPCIroms/DumpPCIroms.c
index 9842a36..7531192 100644
--- a/Lesson_32/UefiLessonsPkg/DumpPCIroms/DumpPCIroms.c
+++ b/Lesson_32/UefiLessonsPkg/DumpPCIroms/DumpPCIroms.c
@@ -160,63 +160,16 @@ UINT64 PciConfigurationAddress(UINT8 Bus,
return Address;
}
-
-EFI_STATUS PrintPCI(EFI_PCI_IO_PROTOCOL* PciIo)
+VOID PrintOptionROM(VOID *RomImage, UINT64 RomSize)
{
- UINTN SegmentNumber;
- UINTN BusNumber;
- UINTN DeviceNumber;
- UINTN FunctionNumber;
- EFI_STATUS Status = PciIo->GetLocation(PciIo,
- &SegmentNumber,
- &BusNumber,
- &DeviceNumber,
- &FunctionNumber);
- if (EFI_ERROR(Status)) {
- Print(L"Error in getting PCI location: %r\n", Status);
- return Status;
- }
-
- PCI_DEVICE_INDEPENDENT_REGION PCIConfHdr;
- Status = PciIo->Pci.Read(PciIo,
- EfiPciIoWidthUint8,
- 0,
- sizeof(PCI_DEVICE_INDEPENDENT_REGION),
- &PCIConfHdr);
-
- if (EFI_ERROR(Status)) {
- Print(L"Error in reading PCI conf space: %r\n", Status);
- return Status;
- }
-
- if (PciIo->RomSize) {
-
- Print(L"%02x:%02x.%02x - Vendor:%04x, Device:%04x", BusNumber,
- DeviceNumber,
- FunctionNumber,
- PCIConfHdr.VendorId,
- PCIConfHdr.DeviceId);
-
- CHAR16 VendorDesc[DESCRIPTOR_STR_MAX_SIZE];
- CHAR16 DeviceDesc[DESCRIPTOR_STR_MAX_SIZE];
- Status = FindPCIDevDescription(PCIConfHdr.VendorId,
- PCIConfHdr.DeviceId,
- VendorDesc,
- DeviceDesc,
- DESCRIPTOR_STR_MAX_SIZE);
- if (!EFI_ERROR(Status)) {
- Print(L": %s, %s\n", VendorDesc, DeviceDesc);
- } else {
- Print(L"\n");
- }
- Print(L"Has OptionROM at memory %p-%p\n", PciIo->RomImage, (UINT8*)PciIo->RomImage + PciIo->RomSize);
- PCI_EXPANSION_ROM_HEADER* RomHeader = (PCI_EXPANSION_ROM_HEADER*) PciIo->RomImage;
- UINTN RomImageIndex = 1;
- while (TRUE)
- {
+ Print(L"Has OptionROM at memory %p-%p\n", RomImage, (UINT8*)RomImage + RomSize);
+ PCI_EXPANSION_ROM_HEADER* RomHeader = (PCI_EXPANSION_ROM_HEADER*) RomImage;
+ UINTN RomImageIndex = 1;
+ while (TRUE)
+ {
if (RomHeader->Signature != PCI_EXPANSION_ROM_HEADER_SIGNATURE) {
Print(L"Error! OptionROM has a wrong signature\n");
- return Status;
+ return;
}
PCI_DATA_STRUCTURE* RomImage = (PCI_DATA_STRUCTURE*)((UINT8*)RomHeader + RomHeader->PcirOffset);
if ((((CHAR8)((RomImage->Signature >> 0) & 0xFF)) != 'P') &&
@@ -224,10 +177,11 @@ EFI_STATUS PrintPCI(EFI_PCI_IO_PROTOCOL* PciIo)
(((CHAR8)((RomImage->Signature >> 16) & 0xFF)) != 'I') &&
(((CHAR8)((RomImage->Signature >> 24) & 0xFF)) != 'R')) {
Print(L"Error! OptionROM image has wrong signature\n");
- return Status;
+ return;
}
Print(L"---Code Image %d---\n", RomImageIndex);
Print(L"Address: %p-%p\n", RomHeader, (UINT8*)RomHeader + (RomImage->ImageLength)*512);
+ Print(L"PCIR address: %p\n", RomImage);
Print(L"VendorId: %04x, DeviceId: %04x\n", RomImage->VendorId, RomImage->DeviceId);
Print(L"Type: ");
switch (RomImage->CodeType) {
@@ -249,80 +203,130 @@ EFI_STATUS PrintPCI(EFI_PCI_IO_PROTOCOL* PciIo)
}
if (RomImage->CodeType == 0x03) {
EFI_PCI_EXPANSION_ROM_HEADER* EfiRomHeader = (EFI_PCI_EXPANSION_ROM_HEADER*) RomHeader;
- if (EfiRomHeader->EfiSignature == EFI_PCI_EXPANSION_ROM_HEADER_EFISIGNATURE) {
- Print(L"Subsystem: ");
- switch (EfiRomHeader->EfiSubsystem) {
- case EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION:
- Print(L"EFI Application\n");
- break;
- case EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
- Print(L"EFI Boot Service Driver\n");
- break;
- case EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
- Print(L"EFI Runtime Driver\n");
- break;
- case EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:
- Print(L"EFI SAL Runtime Driver\n");
- break;
- default:
- Print(L"Unknown\n");
- break;
- }
- Print(L"Machine type: ");
- switch (EfiRomHeader->EfiMachineType) {
- case IMAGE_FILE_MACHINE_I386:
- Print(L"IA-32\n");
- break;
- case IMAGE_FILE_MACHINE_IA64:
- Print(L"Itanium\n");
- break;
- case IMAGE_FILE_MACHINE_EBC:
- Print(L"EFI Byte Code (EBC)\n");
- break;
- case IMAGE_FILE_MACHINE_X64:
- Print(L"X64\n");
- break;
- case IMAGE_FILE_MACHINE_ARMTHUMB_MIXED:
- Print(L"ARM\n");
- break;
- case IMAGE_FILE_MACHINE_ARM64:
- Print(L"ARM 64-bit\n");
- break;
- case IMAGE_FILE_MACHINE_RISCV32:
- Print(L"RISCV32\n");
- break;
- case IMAGE_FILE_MACHINE_RISCV64:
- Print(L"RISCV64\n");
- break;
- case IMAGE_FILE_MACHINE_RISCV128:
- Print(L"RISCV128\n");
- break;
- default:
- Print(L"Unknown\n");
- break;
- }
- switch (EfiRomHeader->CompressionType) {
- case EFI_PCI_EXPANSION_ROM_HEADER_COMPRESSED:
- Print(L"Compressed following the UEFI Compression Algorithm\n");
- break;
- case 0:
- Print(L"Uncompressed\n");
- break;
- default:
- Print(L"Unknown compression type\n");
- break;
+ if (EfiRomHeader->EfiSignature == EFI_PCI_EXPANSION_ROM_HEADER_EFISIGNATURE) {
+ Print(L"Subsystem: ");
+ switch (EfiRomHeader->EfiSubsystem) {
+ case EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION:
+ Print(L"EFI Application\n");
+ break;
+ case EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
+ Print(L"EFI Boot Service Driver\n");
+ break;
+ case EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
+ Print(L"EFI Runtime Driver\n");
+ break;
+ case EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:
+ Print(L"EFI SAL Runtime Driver\n");
+ break;
+ default:
+ Print(L"Unknown\n");
+ break;
+ }
+ Print(L"Machine type: ");
+ switch (EfiRomHeader->EfiMachineType) {
+ case IMAGE_FILE_MACHINE_I386:
+ Print(L"IA-32\n");
+ break;
+ case IMAGE_FILE_MACHINE_IA64:
+ Print(L"Itanium\n");
+ break;
+ case IMAGE_FILE_MACHINE_EBC:
+ Print(L"EFI Byte Code (EBC)\n");
+ break;
+ case IMAGE_FILE_MACHINE_X64:
+ Print(L"X64\n");
+ break;
+ case IMAGE_FILE_MACHINE_ARMTHUMB_MIXED:
+ Print(L"ARM\n");
+ break;
+ case IMAGE_FILE_MACHINE_ARM64:
+ Print(L"ARM 64-bit\n");
+ break;
+ case IMAGE_FILE_MACHINE_RISCV32:
+ Print(L"RISCV32\n");
+ break;
+ case IMAGE_FILE_MACHINE_RISCV64:
+ Print(L"RISCV64\n");
+ break;
+ case IMAGE_FILE_MACHINE_RISCV128:
+ Print(L"RISCV128\n");
+ break;
+ default:
+ Print(L"Unknown\n");
+ break;
+ }
+ switch (EfiRomHeader->CompressionType) {
+ case EFI_PCI_EXPANSION_ROM_HEADER_COMPRESSED:
+ Print(L"Compressed following the UEFI Compression Algorithm\n");
+ break;
+ case 0:
+ Print(L"Uncompressed\n");
+ break;
+ default:
+ Print(L"Unknown compression type\n");
+ break;
+ }
+ } else {
+ Print(L"EFI signature is incorrect!\n");
}
- } else {
- Print(L"EFI signature is incorrect!\n");
- }
}
if ((RomImage->Indicator) & 0x80) {
break;
}
RomHeader = (PCI_EXPANSION_ROM_HEADER*)((UINT8*) RomHeader + (RomImage->ImageLength)*512);
RomImageIndex++;
- }
- Print(L"------------------\n");
+ }
+ Print(L"------------------\n");
+}
+
+EFI_STATUS PrintPCI(EFI_PCI_IO_PROTOCOL* PciIo)
+{
+ UINTN SegmentNumber;
+ UINTN BusNumber;
+ UINTN DeviceNumber;
+ UINTN FunctionNumber;
+ EFI_STATUS Status = PciIo->GetLocation(PciIo,
+ &SegmentNumber,
+ &BusNumber,
+ &DeviceNumber,
+ &FunctionNumber);
+ if (EFI_ERROR(Status)) {
+ Print(L"Error in getting PCI location: %r\n", Status);
+ return Status;
+ }
+
+ PCI_DEVICE_INDEPENDENT_REGION PCIConfHdr;
+ Status = PciIo->Pci.Read(PciIo,
+ EfiPciIoWidthUint8,
+ 0,
+ sizeof(PCI_DEVICE_INDEPENDENT_REGION),
+ &PCIConfHdr);
+
+ if (EFI_ERROR(Status)) {
+ Print(L"Error in reading PCI conf space: %r\n", Status);
+ return Status;
+ }
+
+ if (PciIo->RomSize) {
+ Print(L"%02x:%02x.%02x - Vendor:%04x, Device:%04x", BusNumber,
+ DeviceNumber,
+ FunctionNumber,
+ PCIConfHdr.VendorId,
+ PCIConfHdr.DeviceId);
+
+ CHAR16 VendorDesc[DESCRIPTOR_STR_MAX_SIZE];
+ CHAR16 DeviceDesc[DESCRIPTOR_STR_MAX_SIZE];
+ Status = FindPCIDevDescription(PCIConfHdr.VendorId,
+ PCIConfHdr.DeviceId,
+ VendorDesc,
+ DeviceDesc,
+ DESCRIPTOR_STR_MAX_SIZE);
+ if (!EFI_ERROR(Status)) {
+ Print(L": %s, %s\n", VendorDesc, DeviceDesc);
+ } else {
+ Print(L"\n");
+ }
+ PrintOptionROM(PciIo->RomImage, PciIo->RomSize);
}
return Status;
}