From 01ce3325de427b77049935f4d2c9a1436f6849d7 Mon Sep 17 00:00:00 2001 From: Patrick Magauran Date: Tue, 8 Dec 2020 11:20:33 -0500 Subject: [PATCH] Add better errors --- QemuFwCfgLib.c | 348 ++++++++++++++++++++++++------------------------- bdsmSize.bin | Bin 0 -> 4 bytes i915ovmf.c | 48 ++++--- 3 files changed, 195 insertions(+), 201 deletions(-) create mode 100644 bdsmSize.bin diff --git a/QemuFwCfgLib.c b/QemuFwCfgLib.c index 4469f95..e0b3a3f 100755 --- a/QemuFwCfgLib.c +++ b/QemuFwCfgLib.c @@ -25,7 +25,6 @@ #include "QemuFwCfgLibInternal.h" - /** Selects a firmware configuration item for reading. @@ -36,16 +35,15 @@ **/ VOID - EFIAPI -QemuFwCfgSelectItem ( + EFIAPI + QemuFwCfgSelectItem( IN -FIRMWARE_CONFIG_ITEM QemuFwCfgItem -) + FIRMWARE_CONFIG_ITEM QemuFwCfgItem) { -DEBUG ((EFI_D_INFO, -"Select Item: 0x%x\n", (UINT16)(UINTN) QemuFwCfgItem)); -IoWrite16 (FW_CFG_IO_SELECTOR, (UINT16)(UINTN) -QemuFwCfgItem); + DEBUG((EFI_D_INFO, + "Select Item: 0x%x\n", (UINT16)(UINTN)QemuFwCfgItem)); + IoWrite16(FW_CFG_IO_SELECTOR, (UINT16)(UINTN) + QemuFwCfgItem); } /** @@ -56,29 +54,28 @@ QemuFwCfgItem); **/ VOID - EFIAPI -InternalQemuFwCfgReadBytes ( + EFIAPI + InternalQemuFwCfgReadBytes( IN -UINTN Size, + UINTN Size, IN -VOID *Buffer -OPTIONAL -) + VOID *Buffer + OPTIONAL) { -if ( + if ( -InternalQemuFwCfgDmaIsAvailable() + InternalQemuFwCfgDmaIsAvailable() -&& Size <= MAX_UINT32) { -InternalQemuFwCfgDmaBytes ((UINT32) -Size, Buffer, FW_CFG_DMA_CTL_READ); -return; -} -IoReadFifo8 (FW_CFG_IO_DATA, Size, Buffer -); + && Size <= MAX_UINT32) + { + InternalQemuFwCfgDmaBytes((UINT32) + Size, + Buffer, FW_CFG_DMA_CTL_READ); + return; + } + IoReadFifo8(FW_CFG_IO_DATA, Size, Buffer); } - /** Reads firmware configuration bytes into a buffer @@ -91,25 +88,25 @@ IoReadFifo8 (FW_CFG_IO_DATA, Size, Buffer **/ VOID - EFIAPI -QemuFwCfgReadBytes ( + EFIAPI + QemuFwCfgReadBytes( IN -UINTN Size, + UINTN Size, IN -VOID *Buffer -) + VOID *Buffer) { -if ( + if ( -InternalQemuFwCfgIsAvailable() + InternalQemuFwCfgIsAvailable() -) { -InternalQemuFwCfgReadBytes (Size, Buffer -); -} else { -ZeroMem (Buffer, Size -); -} + ) + { + InternalQemuFwCfgReadBytes(Size, Buffer); + } + else + { + ZeroMem(Buffer, Size); + } } /** @@ -124,34 +121,34 @@ ZeroMem (Buffer, Size **/ VOID - EFIAPI -QemuFwCfgWriteBytes ( + EFIAPI + QemuFwCfgWriteBytes( IN -UINTN Size, + UINTN Size, IN -VOID *Buffer -) + VOID *Buffer) { -if ( - -InternalQemuFwCfgIsAvailable() + if ( -) { -if ( + InternalQemuFwCfgIsAvailable() -InternalQemuFwCfgDmaIsAvailable() - -&& Size <= MAX_UINT32) { -InternalQemuFwCfgDmaBytes ((UINT32) -Size, Buffer, FW_CFG_DMA_CTL_WRITE); -return; -} -IoWriteFifo8 (FW_CFG_IO_DATA, Size, Buffer -); -} + ) + { + if ( + + InternalQemuFwCfgDmaIsAvailable() + + && Size <= MAX_UINT32) + { + InternalQemuFwCfgDmaBytes((UINT32) + Size, + Buffer, FW_CFG_DMA_CTL_WRITE); + return; + } + IoWriteFifo8(FW_CFG_IO_DATA, Size, Buffer); + } } - /** Skip bytes in the firmware configuration item. @@ -162,52 +159,53 @@ IoWriteFifo8 (FW_CFG_IO_DATA, Size, Buffer @param[in] Size Number of bytes to skip. **/ VOID - EFIAPI -QemuFwCfgSkipBytes ( + EFIAPI + QemuFwCfgSkipBytes( IN -UINTN Size -) + UINTN Size) { -UINTN ChunkSize; -UINT8 SkipBuffer[256]; + UINTN ChunkSize; + UINT8 SkipBuffer[256]; -if (! + if (! -InternalQemuFwCfgIsAvailable() + InternalQemuFwCfgIsAvailable() -) { -return; -} + ) + { + return; + } -if ( + if ( -InternalQemuFwCfgDmaIsAvailable() + InternalQemuFwCfgDmaIsAvailable() -&& Size <= MAX_UINT32) { -InternalQemuFwCfgDmaBytes ((UINT32) -Size, NULL, FW_CFG_DMA_CTL_SKIP); -return; -} + && Size <= MAX_UINT32) + { + InternalQemuFwCfgDmaBytes((UINT32) + Size, + NULL, FW_CFG_DMA_CTL_SKIP); + return; + } -// -// Emulate the skip by reading data in chunks, and throwing it away. The -// implementation below is suitable even for phases where RAM or dynamic -// allocation is not available or appropriate. It also doesn't affect the -// static data footprint for client modules. Large skips are not expected, -// therefore this fallback is not performance critical. The size of -// SkipBuffer is thought not to exert a large pressure on the stack in any -// phase. -// -while (Size > 0) { -ChunkSize = MIN(Size, sizeof SkipBuffer); -IoReadFifo8 (FW_CFG_IO_DATA, ChunkSize, SkipBuffer -); -Size -= -ChunkSize; -} + // + // Emulate the skip by reading data in chunks, and throwing it away. The + // implementation below is suitable even for phases where RAM or dynamic + // allocation is not available or appropriate. It also doesn't affect the + // static data footprint for client modules. Large skips are not expected, + // therefore this fallback is not performance critical. The size of + // SkipBuffer is thought not to exert a large pressure on the stack in any + // phase. + // + while (Size > 0) + { + ChunkSize = MIN(Size, sizeof SkipBuffer); + IoReadFifo8(FW_CFG_IO_DATA, ChunkSize, SkipBuffer); + Size -= + ChunkSize; + } } - /** Reads a UINT8 firmware configuration value @@ -215,18 +213,16 @@ ChunkSize; **/ UINT8 - EFIAPI -QemuFwCfgRead8 ( - VOID -) - { - UINT8 Result; +EFIAPI +QemuFwCfgRead8( + VOID) +{ + UINT8 Result; - QemuFwCfgReadBytes (sizeof(Result), &Result); + QemuFwCfgReadBytes(sizeof(Result), &Result); return Result; - } - +} /** Reads a UINT16 firmware configuration value @@ -235,18 +231,16 @@ QemuFwCfgRead8 ( **/ UINT16 - EFIAPI -QemuFwCfgRead16 ( - VOID -) - { - UINT16 Result; +EFIAPI +QemuFwCfgRead16( + VOID) +{ + UINT16 Result; - QemuFwCfgReadBytes (sizeof(Result), &Result); + QemuFwCfgReadBytes(sizeof(Result), &Result); return Result; - } - +} /** Reads a UINT32 firmware configuration value @@ -255,18 +249,16 @@ QemuFwCfgRead16 ( **/ UINT32 - EFIAPI -QemuFwCfgRead32 ( - VOID -) - { - UINT32 Result; +EFIAPI +QemuFwCfgRead32( + VOID) +{ + UINT32 Result; - QemuFwCfgReadBytes (sizeof(Result), &Result); + QemuFwCfgReadBytes(sizeof(Result), &Result); return Result; - } - +} /** Reads a UINT64 firmware configuration value @@ -275,18 +267,16 @@ QemuFwCfgRead32 ( **/ UINT64 - EFIAPI -QemuFwCfgRead64 ( - VOID -) - { - UINT64 Result; +EFIAPI +QemuFwCfgRead64( + VOID) +{ + UINT64 Result; - QemuFwCfgReadBytes (sizeof(Result), &Result); + QemuFwCfgReadBytes(sizeof(Result), &Result); return Result; - } - +} /** Find the configuration item corresponding to the firmware configuration file. @@ -302,60 +292,56 @@ QemuFwCfgRead64 ( **/ RETURN_STATUS - EFIAPI -QemuFwCfgFindFile ( - IN -CONST CHAR8 -*Name, -OUT FIRMWARE_CONFIG_ITEM -*Item, -OUT UINTN -*Size -) +EFIAPI +QemuFwCfgFindFile( + IN + CONST CHAR8 + *Name, + OUT FIRMWARE_CONFIG_ITEM + *Item, + OUT UINTN + *Size) { -UINT32 Count; -UINT32 Idx; + UINT32 Count; + UINT32 Idx; -if (! + if (! -InternalQemuFwCfgIsAvailable() + InternalQemuFwCfgIsAvailable() -) { -return -RETURN_UNSUPPORTED; -} + ) + { + return RETURN_UNSUPPORTED; + } -QemuFwCfgSelectItem (QemuFwCfgItemFileDir); -Count = SwapBytes32(QemuFwCfgRead32()); - -for ( -Idx = 0; -Idx MAX_UINTN) { - DEBUG((DEBUG_ERROR, "%a: %a: invalid value: %Lu\n", __FUNCTION__, - ASSIGNED_IGD_FW_CFG_BDSM_SIZE, BdsmSize)); + DebugPrint(EFI_D_ERROR, "%a: %a: invalid value: %Lu\n", __FUNCTION__, + ASSIGNED_IGD_FW_CFG_BDSM_SIZE, BdsmSize); return EFI_PROTOCOL_ERROR; } - DEBUG((DEBUG_INFO, "BdsmSize=%Lu\n", BdsmSize)); + DebugPrint(EFI_D_ERROR, "BdsmSize=%Lu\n", BdsmSize); mBdsmSize = (UINTN)BdsmSize; } else { // assume 64M - DEBUG((DEBUG_INFO, "BdsmSize not found\n")); + DebugPrint(EFI_D_ERROR, "BdsmSize not found\n"); // mBdsmSize = (UINTN)(64<<20); } @@ -544,6 +547,11 @@ EFI_STATUS EFIAPI i915ControllerDriverStart( ) { // setup opregion Status = SetupFwcfgStuff(Private->PciIo); + if (EFI_ERROR(Status)) { + DebugPrint(EFI_D_ERROR, "i915: SetupFwcfgStuff Error. Please see https://github.com/RotatingFans/i915ovmfPkg/wiki/Qemu-FwCFG-Workaround for more information\n", Status); + + return Status; //TODO Better cleanup + } DebugPrint(EFI_D_ERROR, "i915: SetupFwcfgStuff returns %d\n", Status); } DebugPrint(EFI_D_ERROR, "i915: after QEMU shenanigans\n");