From: jljusten Date: Mon, 23 Jul 2012 17:10:29 +0000 (+0000) Subject: OvmfPkg: introduce QemuFwCfgFindFile () X-Git-Tag: edk2-stable201903~13229 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=0ac9bc9be45eace87fa43d395889274051badccc OvmfPkg: introduce QemuFwCfgFindFile () Tested with the "bootorder" fw_cfg file. Example contents (leading space added and line terminators transcribed for readability): /pci@i0cf8/ide@1,1/drive@0/disk@0 /pci@i0cf8/ide@1,1/drive@1/disk@0 /pci@i0cf8/ethernet@3/ethernet-phy@0 Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek Reviewed-by: Jordan Justen git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13549 6f19259b-4bc3-4df7-8a09-765794883524 --- diff --git a/OvmfPkg/Include/Library/QemuFwCfgLib.h b/OvmfPkg/Include/Library/QemuFwCfgLib.h index 5a3db7e809..3776d79ea9 100644 --- a/OvmfPkg/Include/Library/QemuFwCfgLib.h +++ b/OvmfPkg/Include/Library/QemuFwCfgLib.h @@ -41,6 +41,7 @@ typedef enum { QemuFwCfgItemKernelSetupAddress = 0x0016, QemuFwCfgItemKernelSetupSize = 0x0017, QemuFwCfgItemKernelSetupData = 0x0018, + QemuFwCfgItemFileDir = 0x0019, QemuFwCfgItemX86AcpiTables = 0x8000, QemuFwCfgItemX86SmbiosTables = 0x8001, @@ -153,5 +154,25 @@ QemuFwCfgRead64 ( ); +/** + Find the configuration item corresponding to the firmware configuration file. + + @param[in] Name - Name of file to look up. + @param[out] Item - Configuration item corresponding to the file, to be passed + to QemuFwCfgSelectItem (). + @param[out] Size - Number of bytes in the file. + + @return RETURN_SUCCESS If file is found. + RETURN_NOT_FOUND If file is not found. + RETURN_UNSUPPORTED If firmware configuration is unavailable. + +**/ +RETURN_STATUS +EFIAPI +QemuFwCfgFindFile ( + IN CONST CHAR8 *Name, + OUT FIRMWARE_CONFIG_ITEM *Item, + OUT UINTN *Size + ); #endif diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c index b94dc67392..8caab42e8b 100644 --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLib.c @@ -244,3 +244,56 @@ QemuFwCfgInitialize ( DEBUG ((EFI_D_INFO, "QemuFwCfg interface is supported.\n")); return RETURN_SUCCESS; } + + +/** + Find the configuration item corresponding to the firmware configuration file. + + @param[in] Name - Name of file to look up. + @param[out] Item - Configuration item corresponding to the file, to be passed + to QemuFwCfgSelectItem (). + @param[out] Size - Number of bytes in the file. + + @return RETURN_SUCCESS If file is found. + RETURN_NOT_FOUND If file is not found. + RETURN_UNSUPPORTED If firmware configuration is unavailable. + +**/ +RETURN_STATUS +EFIAPI +QemuFwCfgFindFile ( + IN CONST CHAR8 *Name, + OUT FIRMWARE_CONFIG_ITEM *Item, + OUT UINTN *Size + ) +{ + UINT32 Count; + UINT32 Idx; + + if (!mQemuFwCfgSupported) { + return RETURN_UNSUPPORTED; + } + + QemuFwCfgSelectItem (QemuFwCfgItemFileDir); + Count = SwapBytes32 (QemuFwCfgRead32 ()); + + for (Idx = 0; Idx < Count; ++Idx) { + UINT32 FileSize; + UINT16 FileSelect; + UINT16 FileReserved; + CHAR8 FName[56]; + + FileSize = QemuFwCfgRead32 (); + FileSelect = QemuFwCfgRead16 (); + FileReserved = QemuFwCfgRead16 (); + InternalQemuFwCfgReadBytes (sizeof (FName), FName); + + if (AsciiStrCmp (Name, FName) == 0) { + *Item = SwapBytes16 (FileSelect); + *Size = SwapBytes32 (FileSize); + return RETURN_SUCCESS; + } + } + + return RETURN_NOT_FOUND; +}