* [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload @ 2021-07-21 13:23 Cheng-Chieh Huang 2021-07-21 13:23 ` [PATCH v1 1/6] UefiPayloadPkg: Add LINUXBOOT payload target Cheng-Chieh Huang ` (7 more replies) 0 siblings, 8 replies; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-21 13:23 UTC (permalink / raw) To: devel Cc: Cheng-Chieh Huang, Daniel Schaefer, Trammell Hudson, Maurice Ma, Guo Dong, Benjamin You These are necessary patches to Support LinuxBoot in UefiPayload. With these paches, we can boot to ESXi and Windows from a linux in QEMU. LinuxBoot README: https://github.com/linuxboot/edk2/blob/uefipayload/UefiPayloadPkg/README.md PR to tianocore: https://github.com/tianocore/edk2/pull/1820 Cheng-Chieh Huang (5): Add LINUXBOOT payload target Use legacy timer in Linuxboot payload Update maximum logic processor to 256 Reserve Payload config in runtime services data Add DISABLE_MMX_SSE to avoid generating floating points operation Trammell Hudson (1): LinuxBoot: use a text format for the configuration block. UefiPayloadPkg/UefiPayloadPkg.dsc | 29 +- UefiPayloadPkg/UefiPayloadPkg.fdf | 5 + .../Library/LbParseLib/LbParseLib.inf | 39 ++ UefiPayloadPkg/Include/Linuxboot.h | 58 +++ .../Library/LbParseLib/LbParseLib.c | 348 ++++++++++++++++++ .../PciHostBridgeLib/PciHostBridgeSupport.c | 6 +- .../UefiPayloadEntry/UefiPayloadEntry.c | 2 + CryptoPkg/Library/OpensslLib/openssl | 2 +- 8 files changed, 480 insertions(+), 9 deletions(-) create mode 100644 UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf create mode 100644 UefiPayloadPkg/Include/Linuxboot.h create mode 100644 UefiPayloadPkg/Library/LbParseLib/LbParseLib.c Cc: Cheng-Chieh Huang <chengchieh@google.com> Cc: Daniel Schaefer <daniel.schaefer@hpe.com> Cc: Trammell Hudson <hudson@trmm.net> Cc: Maurice Ma <maurice.ma@intel.com> Cc: Guo Dong <guo.dong@intel.com> Cc: Benjamin You <benjamin.you@intel.com> -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply [flat|nested] 33+ messages in thread
* [PATCH v1 1/6] UefiPayloadPkg: Add LINUXBOOT payload target 2021-07-21 13:23 [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload Cheng-Chieh Huang @ 2021-07-21 13:23 ` Cheng-Chieh Huang 2021-08-04 2:41 ` [edk2-devel] " Guo Dong 2021-07-21 13:23 ` [PATCH v1 2/6] UefiPayloadPkg: Use legacy timer in Linuxboot payload Cheng-Chieh Huang ` (6 subsequent siblings) 7 siblings, 1 reply; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-21 13:23 UTC (permalink / raw) To: devel; +Cc: Cheng-Chieh Huang Initial commit to support linuxboot payload. Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/UefiPayloadPkg.dsc | 16 +- UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf | 39 +++++ UefiPayloadPkg/Include/Linuxboot.h | 47 ++++++ UefiPayloadPkg/Library/LbParseLib/LbParseLib.c | 168 ++++++++++++++++++++ UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c | 6 +- CryptoPkg/Library/OpensslLib/openssl | 2 +- 6 files changed, 270 insertions(+), 8 deletions(-) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index bcedf1c746b4..54576ba485b7 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -33,6 +33,7 @@ [Defines] # # SBL: UEFI payload for Slim Bootloader # COREBOOT: UEFI payload for coreboot + # LINUXBOOT: UEFI payload for linuxboot # DEFINE BOOTLOADER = SBL @@ -93,6 +94,9 @@ [Defines] [BuildOptions] *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES +!if $(BOOTLOADER) == "LINUXBOOT" + *_*_*_CC_FLAGS = -D LINUXBOOT_PAYLOAD +!endif GCC:*_UNIXGCC_*_CC_FLAGS = -DMDEPKG_NDEBUG GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG INTEL:RELEASE_*_*_CC_FLAGS = /D MDEPKG_NDEBUG @@ -222,11 +226,13 @@ [LibraryClasses] !endif PlatformSupportLib|UefiPayloadPkg/Library/PlatformSupportLibNull/PlatformSupportLibNull.inf !if $(UNIVERSAL_PAYLOAD) == FALSE - !if $(BOOTLOADER) == "COREBOOT" - BlParseLib|UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf - !else - BlParseLib|UefiPayloadPkg/Library/SblParseLib/SblParseLib.inf - !endif + !if $(BOOTLOADER) == "COREBOOT" + BlParseLib|UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf + !elseif $(BOOTLOADER) == "LINUXBOOT" + BlParseLib|UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf + !else + BlParseLib|UefiPayloadPkg/Library/SblParseLib/SblParseLib.inf + !endif !endif DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf diff --git a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf new file mode 100644 index 000000000000..d75ba8db8cf3 --- /dev/null +++ b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf @@ -0,0 +1,39 @@ +## @file +# Linuxboot Table Parse Library. +# +# Copyright (c) 2021, the u-root Authors. All rights reserved.<BR> +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LbParseLib + FILE_GUID = DBA15E1E-4C16-47DF-93C0-AB5888ED14C3 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = BlParseLib + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + LbParseLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + UefiPayloadPkg/UefiPayloadPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + IoLib + DebugLib + PcdLib + +[Pcd] + gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase diff --git a/UefiPayloadPkg/Include/Linuxboot.h b/UefiPayloadPkg/Include/Linuxboot.h new file mode 100644 index 000000000000..34ca18069983 --- /dev/null +++ b/UefiPayloadPkg/Include/Linuxboot.h @@ -0,0 +1,47 @@ +/** @file + LinuxBoot PEI module include file. +**/ +#ifndef _LINUXBOOT_PEI_H_INCLUDED_ +#define _LINUXBOOT_PEI_H_INCLUDED_ + +#if defined(_MSC_VER) +#pragma warning(disable : 4200) +#endif + +#pragma pack(1) +typedef struct SerialPortConfigStruct { + UINT32 Type; + UINT32 BaseAddr; + UINT32 Baud; + UINT32 RegWidth; + UINT32 InputHertz; + UINT32 UartPciAddr; +} SerialPortConfig; + +typedef struct MemoryMapEntryStruct { + UINT64 Start; + UINT64 End; + UINT32 Type; +} MemoryMapEntry; + +typedef struct UefiPayloadConfigStruct { + UINT64 Version; + UINT64 AcpiBase; + UINT64 AcpiSize; + UINT64 SmbiosBase; + UINT64 SmbiosSize; + SerialPortConfig SerialConfig; + UINT32 NumMemoryMapEntries; + MemoryMapEntry MemoryMapEntries[0]; +} UefiPayloadConfig; +#pragma pack() + +#define UEFI_PAYLOAD_CONFIG_VERSION 1 + +#define LINUXBOOT_MEM_RAM 1 +#define LINUXBOOT_MEM_DEFAULT 2 +#define LINUXBOOT_MEM_ACPI 3 +#define LINUXBOOT_MEM_NVS 4 +#define LINUXBOOT_MEM_RESERVED 5 + +#endif // _LINUXBOOT_PEI_H_INCLUDED_ diff --git a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c new file mode 100644 index 000000000000..34bfb6a1073f --- /dev/null +++ b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c @@ -0,0 +1,168 @@ +/** @file + This library will parse the linuxboot table in memory and extract those required + information. + + Copyright (c) 2021, the u-root Authors. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + + +#include <IndustryStandard/Acpi.h> +#include <IndustryStandard/SmBios.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/BlParseLib.h> +#include <Library/DebugLib.h> +#include <Library/IoLib.h> +#include <Library/PcdLib.h> +#include <Linuxboot.h> +#include <Uefi/UefiBaseType.h> + +// Retrieve UefiPayloadConfig from Linuxboot's uefiboot +UefiPayloadConfig* GetUefiPayLoadConfig() { + UefiPayloadConfig* config = + (UefiPayloadConfig*)(UINTN)(PcdGet32(PcdPayloadFdMemBase) - SIZE_64KB); + if (config->Version != UEFI_PAYLOAD_CONFIG_VERSION) { + DEBUG((DEBUG_ERROR, "Expect payload config version: %d, but get %d\n", + UEFI_PAYLOAD_CONFIG_VERSION, config->Version)); + CpuDeadLoop (); + } + return config; +} + +// Align the address and add memory rang to MemInfoCallback +void AddMemoryRange(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN UINTN start, + IN UINTN end, IN int type) { + MEMROY_MAP_ENTRY MemoryMap; + UINTN AlignedStart; + UINTN AlignedEnd; + AlignedStart = ALIGN_VALUE(start, SIZE_4KB); + AlignedEnd = ALIGN_VALUE(end, SIZE_4KB); + // Conservative adjustment on Memory map. This should happen when booting from + // non UEFI bios and it may report a memory region less than 4KB. + if (AlignedStart > start && type != LINUXBOOT_MEM_RAM) { + AlignedStart -= SIZE_4KB; + } + if (AlignedEnd > end + 1 && type == LINUXBOOT_MEM_RAM) { + AlignedEnd -= SIZE_4KB; + } + MemoryMap.Base = AlignedStart; + MemoryMap.Size = AlignedEnd - AlignedStart; + MemoryMap.Type = type; + MemoryMap.Flag = 0; + MemInfoCallback(&MemoryMap, NULL); +} + +/** + Acquire the memory information from the linuxboot table in memory. + + @param MemInfoCallback The callback routine + @param Params Pointer to the callback routine parameter + + @retval RETURN_SUCCESS Successfully find out the memory information. + @retval RETURN_NOT_FOUND Failed to find the memory information. + +**/ +RETURN_STATUS +EFIAPI +ParseMemoryInfo(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN VOID* Params) { + UefiPayloadConfig* config; + int i; + + config = GetUefiPayLoadConfig(); + + DEBUG((DEBUG_INFO, "MemoryMap #entries: %d\n", config->NumMemoryMapEntries)); + + MemoryMapEntry* entry = &config->MemoryMapEntries[0]; + for (i = 0; i < config->NumMemoryMapEntries; i++) { + DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", entry->Start, + entry->End, entry->Type)); + AddMemoryRange(MemInfoCallback, entry->Start, entry->End, entry->Type); + entry++; + } + return RETURN_SUCCESS; +} + +/** + Acquire acpi table and smbios table from linuxboot + + @param SystemTableInfo Pointer to the system table info + + @retval RETURN_SUCCESS Successfully find out the tables. + @retval RETURN_NOT_FOUND Failed to find the tables. + +**/ +RETURN_STATUS +EFIAPI +ParseSystemTable(OUT SYSTEM_TABLE_INFO* SystemTableInfo) { + UefiPayloadConfig* config; + + config = GetUefiPayLoadConfig(); + SystemTableInfo->AcpiTableBase = config->AcpiBase; + SystemTableInfo->AcpiTableSize = config->AcpiSize; + + SystemTableInfo->SmbiosTableBase = config->SmbiosBase; + SystemTableInfo->SmbiosTableSize = config->SmbiosSize; + + return RETURN_SUCCESS; +} + +/** + Find the serial port information + + @param SERIAL_PORT_INFO Pointer to serial port info structure + + @retval RETURN_SUCCESS Successfully find the serial port information. + @retval RETURN_NOT_FOUND Failed to find the serial port information . + +**/ +RETURN_STATUS +EFIAPI +ParseSerialInfo(OUT SERIAL_PORT_INFO* SerialPortInfo) { + UefiPayloadConfig* config; + config = GetUefiPayLoadConfig(); + + SerialPortInfo->BaseAddr = config->SerialConfig.BaseAddr; + SerialPortInfo->RegWidth = config->SerialConfig.RegWidth; + SerialPortInfo->Type = config->SerialConfig.Type; + SerialPortInfo->Baud = config->SerialConfig.Baud; + SerialPortInfo->InputHertz = config->SerialConfig.InputHertz; + SerialPortInfo->UartPciAddr = config->SerialConfig.UartPciAddr; + + return RETURN_SUCCESS; +} + +/** + Find the video frame buffer information + + @param GfxInfo Pointer to the EFI_PEI_GRAPHICS_INFO_HOB structure + + @retval RETURN_SUCCESS Successfully find the video frame buffer +information. + @retval RETURN_NOT_FOUND Failed to find the video frame buffer information . + +**/ +RETURN_STATUS +EFIAPI +ParseGfxInfo(OUT EFI_PEI_GRAPHICS_INFO_HOB* GfxInfo) { + // Not supported + return RETURN_NOT_FOUND; +} + +/** + Find the video frame buffer device information + + @param GfxDeviceInfo Pointer to the EFI_PEI_GRAPHICS_DEVICE_INFO_HOB +structure + + @retval RETURN_SUCCESS Successfully find the video frame buffer +information. + @retval RETURN_NOT_FOUND Failed to find the video frame buffer information. + +**/ +RETURN_STATUS +EFIAPI +ParseGfxDeviceInfo(OUT EFI_PEI_GRAPHICS_DEVICE_INFO_HOB* GfxDeviceInfo) { + return RETURN_NOT_FOUND; +} diff --git a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c b/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c index b0268f05069c..a4f714f765ea 100644 --- a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c +++ b/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c @@ -40,8 +40,9 @@ AdjustRootBridgeResource ( IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G ) { +#ifndef LINUXBOOT_PAYLOAD UINT64 Mask; - +#endif // // For now try to downgrade everything into MEM32 since // - coreboot does not assign resource above 4GB @@ -80,7 +81,7 @@ AdjustRootBridgeResource ( PMemAbove4G->Base = MAX_UINT64; PMemAbove4G->Limit = 0; } - +#ifndef LINUXBOOT_PAYLOAD // // Align IO resource at 4K boundary // @@ -98,6 +99,7 @@ AdjustRootBridgeResource ( if (Mem->Base != MAX_UINT64) { Mem->Base &= ~Mask; } +#endif } /** diff --git a/CryptoPkg/Library/OpensslLib/openssl b/CryptoPkg/Library/OpensslLib/openssl index 52c587d60be6..e2e09d9fba11 160000 --- a/CryptoPkg/Library/OpensslLib/openssl +++ b/CryptoPkg/Library/OpensslLib/openssl @@ -1 +1 @@ -Subproject commit 52c587d60be67c337364b830dd3fdc15404a2f04 +Subproject commit e2e09d9fba1187f8d6aafaa34d4172f56f1ffb72 -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 1/6] UefiPayloadPkg: Add LINUXBOOT payload target 2021-07-21 13:23 ` [PATCH v1 1/6] UefiPayloadPkg: Add LINUXBOOT payload target Cheng-Chieh Huang @ 2021-08-04 2:41 ` Guo Dong 0 siblings, 0 replies; 33+ messages in thread From: Guo Dong @ 2021-08-04 2:41 UTC (permalink / raw) To: devel@edk2.groups.io, chengchieh@google.com Move Linuxboot.h under UefiPayloadPkg/Library/LbParseLib since this header file is only used by this library. Update LbParseLib.c following https://edk2-docs.gitbook.io/edk-ii-c-coding-standards-specification/ e.g. + UefiPayloadConfig* config; + int i; Change to: + UefiPayloadConfig *Config; + UINTN Index; And split below code into multiple lines for better readable. +// Align the address and add memory rang to MemInfoCallback void +AddMemoryRange(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN UINTN start, + IN UINTN end, IN int type) { Update OpenSsl submodule in a separate patch if required. Thanks, Guo -----Original Message----- From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Cheng-Chieh Huang via groups.io Sent: Wednesday, July 21, 2021 6:23 AM To: devel@edk2.groups.io Cc: Cheng-Chieh Huang <chengchieh@google.com> Subject: [edk2-devel] [PATCH v1 1/6] UefiPayloadPkg: Add LINUXBOOT payload target Initial commit to support linuxboot payload. Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/UefiPayloadPkg.dsc | 16 +- UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf | 39 +++++ UefiPayloadPkg/Include/Linuxboot.h | 47 ++++++ UefiPayloadPkg/Library/LbParseLib/LbParseLib.c | 168 ++++++++++++++++++++ UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c | 6 +- CryptoPkg/Library/OpensslLib/openssl | 2 +- 6 files changed, 270 insertions(+), 8 deletions(-) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index bcedf1c746b4..54576ba485b7 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -33,6 +33,7 @@ [Defines] # # SBL: UEFI payload for Slim Bootloader # COREBOOT: UEFI payload for coreboot + # LINUXBOOT: UEFI payload for linuxboot # DEFINE BOOTLOADER = SBL @@ -93,6 +94,9 @@ [Defines] [BuildOptions] *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES +!if $(BOOTLOADER) == "LINUXBOOT" + *_*_*_CC_FLAGS = -D LINUXBOOT_PAYLOAD +!endif GCC:*_UNIXGCC_*_CC_FLAGS = -DMDEPKG_NDEBUG GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG INTEL:RELEASE_*_*_CC_FLAGS = /D MDEPKG_NDEBUG @@ -222,11 +226,13 @@ [LibraryClasses] !endif PlatformSupportLib|UefiPayloadPkg/Library/PlatformSupportLibNull/PlatformSupportLibNull.inf !if $(UNIVERSAL_PAYLOAD) == FALSE - !if $(BOOTLOADER) == "COREBOOT" - BlParseLib|UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf - !else - BlParseLib|UefiPayloadPkg/Library/SblParseLib/SblParseLib.inf - !endif + !if $(BOOTLOADER) == "COREBOOT" + BlParseLib|UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf + !elseif $(BOOTLOADER) == "LINUXBOOT" + BlParseLib|UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf + !else + BlParseLib|UefiPayloadPkg/Library/SblParseLib/SblParseLib.inf + !endif !endif DebugLib|MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf diff --git a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf new file mode 100644 index 000000000000..d75ba8db8cf3 --- /dev/null +++ b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf @@ -0,0 +1,39 @@ +## @file +# Linuxboot Table Parse Library. +# +# Copyright (c) 2021, the u-root Authors. All rights reserved.<BR> # +SPDX-License-Identifier: BSD-2-Clause-Patent # ## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = LbParseLib + FILE_GUID = DBA15E1E-4C16-47DF-93C0-AB5888ED14C3 + MODULE_TYPE = BASE + VERSION_STRING = 1.0 + LIBRARY_CLASS = BlParseLib + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + LbParseLib.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + UefiPayloadPkg/UefiPayloadPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + IoLib + DebugLib + PcdLib + +[Pcd] + gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase diff --git a/UefiPayloadPkg/Include/Linuxboot.h b/UefiPayloadPkg/Include/Linuxboot.h new file mode 100644 index 000000000000..34ca18069983 --- /dev/null +++ b/UefiPayloadPkg/Include/Linuxboot.h @@ -0,0 +1,47 @@ +/** @file + LinuxBoot PEI module include file. +**/ +#ifndef _LINUXBOOT_PEI_H_INCLUDED_ +#define _LINUXBOOT_PEI_H_INCLUDED_ + +#if defined(_MSC_VER) +#pragma warning(disable : 4200) +#endif + +#pragma pack(1) +typedef struct SerialPortConfigStruct { + UINT32 Type; + UINT32 BaseAddr; + UINT32 Baud; + UINT32 RegWidth; + UINT32 InputHertz; + UINT32 UartPciAddr; +} SerialPortConfig; + +typedef struct MemoryMapEntryStruct { + UINT64 Start; + UINT64 End; + UINT32 Type; +} MemoryMapEntry; + +typedef struct UefiPayloadConfigStruct { + UINT64 Version; + UINT64 AcpiBase; + UINT64 AcpiSize; + UINT64 SmbiosBase; + UINT64 SmbiosSize; + SerialPortConfig SerialConfig; + UINT32 NumMemoryMapEntries; + MemoryMapEntry MemoryMapEntries[0]; +} UefiPayloadConfig; +#pragma pack() + +#define UEFI_PAYLOAD_CONFIG_VERSION 1 + +#define LINUXBOOT_MEM_RAM 1 +#define LINUXBOOT_MEM_DEFAULT 2 +#define LINUXBOOT_MEM_ACPI 3 +#define LINUXBOOT_MEM_NVS 4 +#define LINUXBOOT_MEM_RESERVED 5 + +#endif // _LINUXBOOT_PEI_H_INCLUDED_ diff --git a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c new file mode 100644 index 000000000000..34bfb6a1073f --- /dev/null +++ b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c @@ -0,0 +1,168 @@ +/** @file + This library will parse the linuxboot table in memory and extract +those required + information. + + Copyright (c) 2021, the u-root Authors. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + + +#include <IndustryStandard/Acpi.h> +#include <IndustryStandard/SmBios.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/BlParseLib.h> +#include <Library/DebugLib.h> +#include <Library/IoLib.h> +#include <Library/PcdLib.h> +#include <Linuxboot.h> +#include <Uefi/UefiBaseType.h> + +// Retrieve UefiPayloadConfig from Linuxboot's uefiboot +UefiPayloadConfig* GetUefiPayLoadConfig() { + UefiPayloadConfig* config = + (UefiPayloadConfig*)(UINTN)(PcdGet32(PcdPayloadFdMemBase) - +SIZE_64KB); + if (config->Version != UEFI_PAYLOAD_CONFIG_VERSION) { + DEBUG((DEBUG_ERROR, "Expect payload config version: %d, but get %d\n", + UEFI_PAYLOAD_CONFIG_VERSION, config->Version)); + CpuDeadLoop (); + } + return config; +} + +// Align the address and add memory rang to MemInfoCallback void +AddMemoryRange(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN UINTN start, + IN UINTN end, IN int type) { + MEMROY_MAP_ENTRY MemoryMap; + UINTN AlignedStart; + UINTN AlignedEnd; + AlignedStart = ALIGN_VALUE(start, SIZE_4KB); + AlignedEnd = ALIGN_VALUE(end, SIZE_4KB); + // Conservative adjustment on Memory map. This should happen when +booting from + // non UEFI bios and it may report a memory region less than 4KB. + if (AlignedStart > start && type != LINUXBOOT_MEM_RAM) { + AlignedStart -= SIZE_4KB; + } + if (AlignedEnd > end + 1 && type == LINUXBOOT_MEM_RAM) { + AlignedEnd -= SIZE_4KB; + } + MemoryMap.Base = AlignedStart; + MemoryMap.Size = AlignedEnd - AlignedStart; + MemoryMap.Type = type; + MemoryMap.Flag = 0; + MemInfoCallback(&MemoryMap, NULL); +} + +/** + Acquire the memory information from the linuxboot table in memory. + + @param MemInfoCallback The callback routine + @param Params Pointer to the callback routine parameter + + @retval RETURN_SUCCESS Successfully find out the memory information. + @retval RETURN_NOT_FOUND Failed to find the memory information. + +**/ +RETURN_STATUS +EFIAPI +ParseMemoryInfo(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN VOID* +Params) { + UefiPayloadConfig* config; + int i; + + config = GetUefiPayLoadConfig(); + + DEBUG((DEBUG_INFO, "MemoryMap #entries: %d\n", + config->NumMemoryMapEntries)); + + MemoryMapEntry* entry = &config->MemoryMapEntries[0]; + for (i = 0; i < config->NumMemoryMapEntries; i++) { + DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", entry->Start, + entry->End, entry->Type)); + AddMemoryRange(MemInfoCallback, entry->Start, entry->End, entry->Type); + entry++; + } + return RETURN_SUCCESS; +} + +/** + Acquire acpi table and smbios table from linuxboot + + @param SystemTableInfo Pointer to the system table info + + @retval RETURN_SUCCESS Successfully find out the tables. + @retval RETURN_NOT_FOUND Failed to find the tables. + +**/ +RETURN_STATUS +EFIAPI +ParseSystemTable(OUT SYSTEM_TABLE_INFO* SystemTableInfo) { + UefiPayloadConfig* config; + + config = GetUefiPayLoadConfig(); + SystemTableInfo->AcpiTableBase = config->AcpiBase; + SystemTableInfo->AcpiTableSize = config->AcpiSize; + + SystemTableInfo->SmbiosTableBase = config->SmbiosBase; + SystemTableInfo->SmbiosTableSize = config->SmbiosSize; + + return RETURN_SUCCESS; +} + +/** + Find the serial port information + + @param SERIAL_PORT_INFO Pointer to serial port info structure + + @retval RETURN_SUCCESS Successfully find the serial port information. + @retval RETURN_NOT_FOUND Failed to find the serial port information . + +**/ +RETURN_STATUS +EFIAPI +ParseSerialInfo(OUT SERIAL_PORT_INFO* SerialPortInfo) { + UefiPayloadConfig* config; + config = GetUefiPayLoadConfig(); + + SerialPortInfo->BaseAddr = config->SerialConfig.BaseAddr; + SerialPortInfo->RegWidth = config->SerialConfig.RegWidth; + SerialPortInfo->Type = config->SerialConfig.Type; + SerialPortInfo->Baud = config->SerialConfig.Baud; + SerialPortInfo->InputHertz = config->SerialConfig.InputHertz; + SerialPortInfo->UartPciAddr = config->SerialConfig.UartPciAddr; + + return RETURN_SUCCESS; +} + +/** + Find the video frame buffer information + + @param GfxInfo Pointer to the EFI_PEI_GRAPHICS_INFO_HOB structure + + @retval RETURN_SUCCESS Successfully find the video frame buffer +information. + @retval RETURN_NOT_FOUND Failed to find the video frame buffer information . + +**/ +RETURN_STATUS +EFIAPI +ParseGfxInfo(OUT EFI_PEI_GRAPHICS_INFO_HOB* GfxInfo) { + // Not supported + return RETURN_NOT_FOUND; +} + +/** + Find the video frame buffer device information + + @param GfxDeviceInfo Pointer to the EFI_PEI_GRAPHICS_DEVICE_INFO_HOB +structure + + @retval RETURN_SUCCESS Successfully find the video frame buffer +information. + @retval RETURN_NOT_FOUND Failed to find the video frame buffer information. + +**/ +RETURN_STATUS +EFIAPI +ParseGfxDeviceInfo(OUT EFI_PEI_GRAPHICS_DEVICE_INFO_HOB* GfxDeviceInfo) +{ + return RETURN_NOT_FOUND; +} diff --git a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c b/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c index b0268f05069c..a4f714f765ea 100644 --- a/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c +++ b/UefiPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c @@ -40,8 +40,9 @@ AdjustRootBridgeResource ( IN PCI_ROOT_BRIDGE_APERTURE *PMemAbove4G ) { +#ifndef LINUXBOOT_PAYLOAD UINT64 Mask; - +#endif // // For now try to downgrade everything into MEM32 since // - coreboot does not assign resource above 4GB @@ -80,7 +81,7 @@ AdjustRootBridgeResource ( PMemAbove4G->Base = MAX_UINT64; PMemAbove4G->Limit = 0; } - +#ifndef LINUXBOOT_PAYLOAD // // Align IO resource at 4K boundary // @@ -98,6 +99,7 @@ AdjustRootBridgeResource ( if (Mem->Base != MAX_UINT64) { Mem->Base &= ~Mask; } +#endif } /** diff --git a/CryptoPkg/Library/OpensslLib/openssl b/CryptoPkg/Library/OpensslLib/openssl index 52c587d60be6..e2e09d9fba11 160000 --- a/CryptoPkg/Library/OpensslLib/openssl +++ b/CryptoPkg/Library/OpensslLib/openssl @@ -1 +1 @@ -Subproject commit 52c587d60be67c337364b830dd3fdc15404a2f04 +Subproject commit e2e09d9fba1187f8d6aafaa34d4172f56f1ffb72 -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
* [PATCH v1 2/6] UefiPayloadPkg: Use legacy timer in Linuxboot payload 2021-07-21 13:23 [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload Cheng-Chieh Huang 2021-07-21 13:23 ` [PATCH v1 1/6] UefiPayloadPkg: Add LINUXBOOT payload target Cheng-Chieh Huang @ 2021-07-21 13:23 ` Cheng-Chieh Huang 2021-08-04 2:22 ` [edk2-devel] " Guo Dong [not found] ` <1697F93BEFA774AB.32148@groups.io> 2021-07-21 13:23 ` [PATCH v1 3/6] UefiPayloadPkg: Update maximum logic processor to 256 Cheng-Chieh Huang ` (5 subsequent siblings) 7 siblings, 2 replies; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-21 13:23 UTC (permalink / raw) To: devel; +Cc: Cheng-Chieh Huang HPET timer may fail to init after prior linux taking over. Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/UefiPayloadPkg.dsc | 6 ++++++ UefiPayloadPkg/UefiPayloadPkg.fdf | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 54576ba485b7..e56e6f4a5379 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -438,7 +438,13 @@ [Components.X64] NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf } +!if $(BOOTLOADER) == "LINUXBOOT" + OvmfPkg/8254TimerDxe/8254Timer.inf + OvmfPkg/8259InterruptControllerDxe/8259.inf +!else PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf +!endif + MdeModulePkg/Universal/Metronome/Metronome.inf MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf diff --git a/UefiPayloadPkg/UefiPayloadPkg.fdf b/UefiPayloadPkg/UefiPayloadPkg.fdf index 041fed842cd8..f57a8b4bf3d3 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.fdf +++ b/UefiPayloadPkg/UefiPayloadPkg.fdf @@ -101,7 +101,12 @@ [FV.DXEFV] INF UefiCpuPkg/CpuDxe/CpuDxe.inf INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf INF MdeModulePkg/Application/UiApp/UiApp.inf +!if $(BOOTLOADER) != "LINUXBOOT" INF PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf +!else +INF OvmfPkg/8254TimerDxe/8254Timer.inf +INF OvmfPkg/8259InterruptControllerDxe/8259.inf +!endif INF MdeModulePkg/Universal/Metronome/Metronome.inf INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 2/6] UefiPayloadPkg: Use legacy timer in Linuxboot payload 2021-07-21 13:23 ` [PATCH v1 2/6] UefiPayloadPkg: Use legacy timer in Linuxboot payload Cheng-Chieh Huang @ 2021-08-04 2:22 ` Guo Dong [not found] ` <1697F93BEFA774AB.32148@groups.io> 1 sibling, 0 replies; 33+ messages in thread From: Guo Dong @ 2021-08-04 2:22 UTC (permalink / raw) To: devel@edk2.groups.io, chengchieh@google.com Signed-off-by: Guo Dong <guo.dong@intel.com> -----Original Message----- From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Cheng-Chieh Huang via groups.io Sent: Wednesday, July 21, 2021 6:23 AM To: devel@edk2.groups.io Cc: Cheng-Chieh Huang <chengchieh@google.com> Subject: [edk2-devel] [PATCH v1 2/6] UefiPayloadPkg: Use legacy timer in Linuxboot payload HPET timer may fail to init after prior linux taking over. Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/UefiPayloadPkg.dsc | 6 ++++++ UefiPayloadPkg/UefiPayloadPkg.fdf | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 54576ba485b7..e56e6f4a5379 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -438,7 +438,13 @@ [Components.X64] NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf } +!if $(BOOTLOADER) == "LINUXBOOT" + OvmfPkg/8254TimerDxe/8254Timer.inf + OvmfPkg/8259InterruptControllerDxe/8259.inf +!else PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf +!endif + MdeModulePkg/Universal/Metronome/Metronome.inf MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf diff --git a/UefiPayloadPkg/UefiPayloadPkg.fdf b/UefiPayloadPkg/UefiPayloadPkg.fdf index 041fed842cd8..f57a8b4bf3d3 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.fdf +++ b/UefiPayloadPkg/UefiPayloadPkg.fdf @@ -101,7 +101,12 @@ [FV.DXEFV] INF UefiCpuPkg/CpuDxe/CpuDxe.inf INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf INF MdeModulePkg/Application/UiApp/UiApp.inf +!if $(BOOTLOADER) != "LINUXBOOT" INF PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf +!else +INF OvmfPkg/8254TimerDxe/8254Timer.inf +INF OvmfPkg/8259InterruptControllerDxe/8259.inf +!endif INF MdeModulePkg/Universal/Metronome/Metronome.inf INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
[parent not found: <1697F93BEFA774AB.32148@groups.io>]
* Re: [edk2-devel] [PATCH v1 2/6] UefiPayloadPkg: Use legacy timer in Linuxboot payload [not found] ` <1697F93BEFA774AB.32148@groups.io> @ 2021-08-04 2:52 ` Guo Dong 0 siblings, 0 replies; 33+ messages in thread From: Guo Dong @ 2021-08-04 2:52 UTC (permalink / raw) To: devel@edk2.groups.io, Dong, Guo, chengchieh@google.com A typo copy, should be: Reviewed-by: Guo Dong <guo.dong@intel.com> -----Original Message----- From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Guo Dong Sent: Tuesday, August 3, 2021 7:22 PM To: devel@edk2.groups.io; chengchieh@google.com Subject: Re: [edk2-devel] [PATCH v1 2/6] UefiPayloadPkg: Use legacy timer in Linuxboot payload Signed-off-by: Guo Dong <guo.dong@intel.com> -----Original Message----- From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Cheng-Chieh Huang via groups.io Sent: Wednesday, July 21, 2021 6:23 AM To: devel@edk2.groups.io Cc: Cheng-Chieh Huang <chengchieh@google.com> Subject: [edk2-devel] [PATCH v1 2/6] UefiPayloadPkg: Use legacy timer in Linuxboot payload HPET timer may fail to init after prior linux taking over. Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/UefiPayloadPkg.dsc | 6 ++++++ UefiPayloadPkg/UefiPayloadPkg.fdf | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 54576ba485b7..e56e6f4a5379 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -438,7 +438,13 @@ [Components.X64] NULL|MdeModulePkg/Library/BootMaintenanceManagerUiLib/BootMaintenanceManagerUiLib.inf } +!if $(BOOTLOADER) == "LINUXBOOT" + OvmfPkg/8254TimerDxe/8254Timer.inf + OvmfPkg/8259InterruptControllerDxe/8259.inf +!else PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf +!endif + MdeModulePkg/Universal/Metronome/Metronome.inf MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf diff --git a/UefiPayloadPkg/UefiPayloadPkg.fdf b/UefiPayloadPkg/UefiPayloadPkg.fdf index 041fed842cd8..f57a8b4bf3d3 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.fdf +++ b/UefiPayloadPkg/UefiPayloadPkg.fdf @@ -101,7 +101,12 @@ [FV.DXEFV] INF UefiCpuPkg/CpuDxe/CpuDxe.inf INF MdeModulePkg/Universal/BdsDxe/BdsDxe.inf INF MdeModulePkg/Application/UiApp/UiApp.inf +!if $(BOOTLOADER) != "LINUXBOOT" INF PcAtChipsetPkg/HpetTimerDxe/HpetTimerDxe.inf +!else +INF OvmfPkg/8254TimerDxe/8254Timer.inf +INF OvmfPkg/8259InterruptControllerDxe/8259.inf +!endif INF MdeModulePkg/Universal/Metronome/Metronome.inf INF MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf INF MdeModulePkg/Core/RuntimeDxe/RuntimeDxe.inf -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
* [PATCH v1 3/6] UefiPayloadPkg: Update maximum logic processor to 256 2021-07-21 13:23 [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload Cheng-Chieh Huang 2021-07-21 13:23 ` [PATCH v1 1/6] UefiPayloadPkg: Add LINUXBOOT payload target Cheng-Chieh Huang 2021-07-21 13:23 ` [PATCH v1 2/6] UefiPayloadPkg: Use legacy timer in Linuxboot payload Cheng-Chieh Huang @ 2021-07-21 13:23 ` Cheng-Chieh Huang 2021-08-04 2:22 ` [edk2-devel] " Guo Dong [not found] ` <1697F92B243CA725.1963@groups.io> 2021-07-21 13:23 ` [PATCH v1 4/6] UefiPayloadPkg: Reserve Payload config in runtime services data Cheng-Chieh Huang ` (4 subsequent siblings) 7 siblings, 2 replies; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-21 13:23 UTC (permalink / raw) To: devel; +Cc: Cheng-Chieh Huang Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/UefiPayloadPkg.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index e56e6f4a5379..8aa5f18cd35c 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -40,7 +40,7 @@ [Defines] # # CPU options # - DEFINE MAX_LOGICAL_PROCESSORS = 64 + DEFINE MAX_LOGICAL_PROCESSORS = 256 # # PCI options -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 3/6] UefiPayloadPkg: Update maximum logic processor to 256 2021-07-21 13:23 ` [PATCH v1 3/6] UefiPayloadPkg: Update maximum logic processor to 256 Cheng-Chieh Huang @ 2021-08-04 2:22 ` Guo Dong [not found] ` <1697F92B243CA725.1963@groups.io> 1 sibling, 0 replies; 33+ messages in thread From: Guo Dong @ 2021-08-04 2:22 UTC (permalink / raw) To: devel@edk2.groups.io, chengchieh@google.com Signed-off-by: Guo Dong <guo.dong@intel.com> -----Original Message----- From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Cheng-Chieh Huang via groups.io Sent: Wednesday, July 21, 2021 6:23 AM To: devel@edk2.groups.io Cc: Cheng-Chieh Huang <chengchieh@google.com> Subject: [edk2-devel] [PATCH v1 3/6] UefiPayloadPkg: Update maximum logic processor to 256 Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/UefiPayloadPkg.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index e56e6f4a5379..8aa5f18cd35c 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -40,7 +40,7 @@ [Defines] # # CPU options # - DEFINE MAX_LOGICAL_PROCESSORS = 64 + DEFINE MAX_LOGICAL_PROCESSORS = 256 # # PCI options -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
[parent not found: <1697F92B243CA725.1963@groups.io>]
* Re: [edk2-devel] [PATCH v1 3/6] UefiPayloadPkg: Update maximum logic processor to 256 [not found] ` <1697F92B243CA725.1963@groups.io> @ 2021-08-04 2:51 ` Guo Dong 0 siblings, 0 replies; 33+ messages in thread From: Guo Dong @ 2021-08-04 2:51 UTC (permalink / raw) To: devel@edk2.groups.io, Dong, Guo, chengchieh@google.com A typo copy, should be: Reviewed-by: Guo Dong <guo.dong@intel.com> -----Original Message----- From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Guo Dong Sent: Tuesday, August 3, 2021 7:22 PM To: devel@edk2.groups.io; chengchieh@google.com Subject: Re: [edk2-devel] [PATCH v1 3/6] UefiPayloadPkg: Update maximum logic processor to 256 Signed-off-by: Guo Dong <guo.dong@intel.com> -----Original Message----- From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Cheng-Chieh Huang via groups.io Sent: Wednesday, July 21, 2021 6:23 AM To: devel@edk2.groups.io Cc: Cheng-Chieh Huang <chengchieh@google.com> Subject: [edk2-devel] [PATCH v1 3/6] UefiPayloadPkg: Update maximum logic processor to 256 Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/UefiPayloadPkg.dsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index e56e6f4a5379..8aa5f18cd35c 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -40,7 +40,7 @@ [Defines] # # CPU options # - DEFINE MAX_LOGICAL_PROCESSORS = 64 + DEFINE MAX_LOGICAL_PROCESSORS = 256 # # PCI options -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
* [PATCH v1 4/6] UefiPayloadPkg: Reserve Payload config in runtime services data 2021-07-21 13:23 [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload Cheng-Chieh Huang ` (2 preceding siblings ...) 2021-07-21 13:23 ` [PATCH v1 3/6] UefiPayloadPkg: Update maximum logic processor to 256 Cheng-Chieh Huang @ 2021-07-21 13:23 ` Cheng-Chieh Huang 2021-08-04 2:44 ` [edk2-devel] " Guo Dong 2021-07-21 13:23 ` [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation Cheng-Chieh Huang ` (3 subsequent siblings) 7 siblings, 1 reply; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-21 13:23 UTC (permalink / raw) To: devel; +Cc: Cheng-Chieh Huang Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c index ae16f25c7c0e..70afbf83ed4a 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c @@ -517,6 +517,8 @@ BuildGenericHob ( // The UEFI payload FV BuildMemoryAllocationHob (PcdGet32 (PcdPayloadFdMemBase), PcdGet32 (PcdPayloadFdMemSize), EfiBootServicesData); + // The UEFI payload config FV + BuildMemoryAllocationHob (PcdGet32 (PcdPayloadFdMemBase) - SIZE_64KB, SIZE_64KB, EfiRuntimeServicesData); // // Build CPU memory space and IO space hob -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 4/6] UefiPayloadPkg: Reserve Payload config in runtime services data 2021-07-21 13:23 ` [PATCH v1 4/6] UefiPayloadPkg: Reserve Payload config in runtime services data Cheng-Chieh Huang @ 2021-08-04 2:44 ` Guo Dong 2021-08-04 6:23 ` Cheng-Chieh Huang 0 siblings, 1 reply; 33+ messages in thread From: Guo Dong @ 2021-08-04 2:44 UTC (permalink / raw) To: devel@edk2.groups.io, chengchieh@google.com why build runtime memory allocation hob here? The PayloadEntry should already got the information and build a new HOB list to DXE core, will anyone access these region late? If yes, maybe you need add LINUXBOOT_PAYLOAD flag for this code, and update commit message on this. Thanks, Guo -----Original Message----- From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Cheng-Chieh Huang via groups.io Sent: Wednesday, July 21, 2021 6:23 AM To: devel@edk2.groups.io Cc: Cheng-Chieh Huang <chengchieh@google.com> Subject: [edk2-devel] [PATCH v1 4/6] UefiPayloadPkg: Reserve Payload config in runtime services data Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c index ae16f25c7c0e..70afbf83ed4a 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c @@ -517,6 +517,8 @@ BuildGenericHob ( // The UEFI payload FV BuildMemoryAllocationHob (PcdGet32 (PcdPayloadFdMemBase), PcdGet32 (PcdPayloadFdMemSize), EfiBootServicesData); + // The UEFI payload config FV + BuildMemoryAllocationHob (PcdGet32 (PcdPayloadFdMemBase) - SIZE_64KB, SIZE_64KB, EfiRuntimeServicesData); // // Build CPU memory space and IO space hob -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 4/6] UefiPayloadPkg: Reserve Payload config in runtime services data 2021-08-04 2:44 ` [edk2-devel] " Guo Dong @ 2021-08-04 6:23 ` Cheng-Chieh Huang 2021-08-04 13:37 ` Guo Dong 0 siblings, 1 reply; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-08-04 6:23 UTC (permalink / raw) To: Dong, Guo; +Cc: devel@edk2.groups.io [-- Attachment #1: Type: text/plain, Size: 2288 bytes --] Hi Guo, Thanks for the review. This is a quick fix for today's PlatformHookLib design. PlatformHookLib (probably via PlatformBootManagerLib) will be linked by BDS and potentially called again in Windows bootloader. If we did not reserve this range of memory, system will crash the system when it was called. This can be reproduced if we boot Windows 2018. I also did not think reserving this memory til runtime is a good idea, but I am not sure why we want to link PlatformHookLib to PlatformBootManagerLib. I tried to remove PlatformHookLib in PlatformBootManagerLib and it seems to work as well. maybe we should take this approach. what do you think? -- Cheng-Chieh On Wed, Aug 4, 2021 at 10:44 AM Dong, Guo <guo.dong@intel.com> wrote: > > why build runtime memory allocation hob here? > The PayloadEntry should already got the information and build a new HOB > list to DXE core, will anyone access these region late? > If yes, maybe you need add LINUXBOOT_PAYLOAD flag for this code, and > update commit message on this. > > Thanks, > Guo > > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of > Cheng-Chieh Huang via groups.io > Sent: Wednesday, July 21, 2021 6:23 AM > To: devel@edk2.groups.io > Cc: Cheng-Chieh Huang <chengchieh@google.com> > Subject: [edk2-devel] [PATCH v1 4/6] UefiPayloadPkg: Reserve Payload > config in runtime services data > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> > --- > UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c > b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c > index ae16f25c7c0e..70afbf83ed4a 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c > +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c > @@ -517,6 +517,8 @@ BuildGenericHob ( > > // The UEFI payload FV > BuildMemoryAllocationHob (PcdGet32 (PcdPayloadFdMemBase), PcdGet32 > (PcdPayloadFdMemSize), EfiBootServicesData); > + // The UEFI payload config FV > + BuildMemoryAllocationHob (PcdGet32 (PcdPayloadFdMemBase) - SIZE_64KB, > SIZE_64KB, EfiRuntimeServicesData); > > // > // Build CPU memory space and IO space hob > -- > 2.32.0.402.g57bb445576-goog > > > > > > > [-- Attachment #2: Type: text/html, Size: 3164 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 4/6] UefiPayloadPkg: Reserve Payload config in runtime services data 2021-08-04 6:23 ` Cheng-Chieh Huang @ 2021-08-04 13:37 ` Guo Dong 0 siblings, 0 replies; 33+ messages in thread From: Guo Dong @ 2021-08-04 13:37 UTC (permalink / raw) To: Cheng-Chieh Huang; +Cc: devel@edk2.groups.io [-- Attachment #1: Type: text/plain, Size: 3299 bytes --] Hi Cheng-Chieh, I see. In order to use same PlatformHookLib to make DebugLib works in both PayloadEntry and DXE phase, the PlatformHookLib gets serial port info from bootloader. In the DXE phase, UniversalPayloadPlatformHookLib will use HOB instead of getting info from bootloader. In the PayloadEntry module, we should build same serial port HOB so that DXE module could use UniversalPayloadPlatformHookLib Instead of PlatformHookLib. For this patch, you could add LINUXBOOT_PAYLOAD flag with commit message update, I will revert this patch once above change is completed. Thanks, Guo From: Cheng-Chieh Huang <chengchieh@google.com> Sent: Tuesday, August 3, 2021 11:24 PM To: Dong, Guo <guo.dong@intel.com> Cc: devel@edk2.groups.io Subject: Re: [edk2-devel] [PATCH v1 4/6] UefiPayloadPkg: Reserve Payload config in runtime services data Hi Guo, Thanks for the review. This is a quick fix for today's PlatformHookLib design. PlatformHookLib (probably via PlatformBootManagerLib) will be linked by BDS and potentially called again in Windows bootloader. If we did not reserve this range of memory, system will crash the system when it was called. This can be reproduced if we boot Windows 2018. I also did not think reserving this memory til runtime is a good idea, but I am not sure why we want to link PlatformHookLib to PlatformBootManagerLib. I tried to remove PlatformHookLib in PlatformBootManagerLib and it seems to work as well. maybe we should take this approach. what do you think? -- Cheng-Chieh On Wed, Aug 4, 2021 at 10:44 AM Dong, Guo <guo.dong@intel.com<mailto:guo.dong@intel.com>> wrote: why build runtime memory allocation hob here? The PayloadEntry should already got the information and build a new HOB list to DXE core, will anyone access these region late? If yes, maybe you need add LINUXBOOT_PAYLOAD flag for this code, and update commit message on this. Thanks, Guo -----Original Message----- From: devel@edk2.groups.io<mailto:devel@edk2.groups.io> <devel@edk2.groups.io<mailto:devel@edk2.groups.io>> On Behalf Of Cheng-Chieh Huang via groups.io<http://groups.io> Sent: Wednesday, July 21, 2021 6:23 AM To: devel@edk2.groups.io<mailto:devel@edk2.groups.io> Cc: Cheng-Chieh Huang <chengchieh@google.com<mailto:chengchieh@google.com>> Subject: [edk2-devel] [PATCH v1 4/6] UefiPayloadPkg: Reserve Payload config in runtime services data Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com<mailto:chengchieh@google.com>> --- UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c index ae16f25c7c0e..70afbf83ed4a 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c @@ -517,6 +517,8 @@ BuildGenericHob ( // The UEFI payload FV BuildMemoryAllocationHob (PcdGet32 (PcdPayloadFdMemBase), PcdGet32 (PcdPayloadFdMemSize), EfiBootServicesData); + // The UEFI payload config FV + BuildMemoryAllocationHob (PcdGet32 (PcdPayloadFdMemBase) - SIZE_64KB, SIZE_64KB, EfiRuntimeServicesData); // // Build CPU memory space and IO space hob -- 2.32.0.402.g57bb445576-goog [-- Attachment #2: Type: text/html, Size: 6562 bytes --] ^ permalink raw reply related [flat|nested] 33+ messages in thread
* [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation 2021-07-21 13:23 [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload Cheng-Chieh Huang ` (3 preceding siblings ...) 2021-07-21 13:23 ` [PATCH v1 4/6] UefiPayloadPkg: Reserve Payload config in runtime services data Cheng-Chieh Huang @ 2021-07-21 13:23 ` Cheng-Chieh Huang 2021-07-21 16:34 ` [edk2-devel] " Michael D Kinney 2021-07-21 13:23 ` [PATCH v1 6/6] UefiPayloadPkg: LinuxBoot: use a text format for the configuration block Cheng-Chieh Huang ` (2 subsequent siblings) 7 siblings, 1 reply; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-21 13:23 UTC (permalink / raw) To: devel; +Cc: Cheng-Chieh Huang This will allow we compile payload using gcc8 Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/UefiPayloadPkg.dsc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc index 8aa5f18cd35c..fa41c5a24af5 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dsc +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc @@ -30,6 +30,8 @@ [Defines] DEFINE PS2_KEYBOARD_ENABLE = FALSE DEFINE UNIVERSAL_PAYLOAD = FALSE + DEFINE DISABLE_MMX_SSE = FALSE + # # SBL: UEFI payload for Slim Bootloader # COREBOOT: UEFI payload for coreboot @@ -96,6 +98,9 @@ [BuildOptions] *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES !if $(BOOTLOADER) == "LINUXBOOT" *_*_*_CC_FLAGS = -D LINUXBOOT_PAYLOAD +!endif +!if $(DISABLE_MMX_SSE) + *_*_*_CC_FLAGS = -mno-mmx -mno-sse !endif GCC:*_UNIXGCC_*_CC_FLAGS = -DMDEPKG_NDEBUG GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation 2021-07-21 13:23 ` [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation Cheng-Chieh Huang @ 2021-07-21 16:34 ` Michael D Kinney 2021-07-21 17:42 ` Cheng-Chieh Huang 0 siblings, 1 reply; 33+ messages in thread From: Michael D Kinney @ 2021-07-21 16:34 UTC (permalink / raw) To: devel@edk2.groups.io, chengchieh@google.com, Kinney, Michael D Are those flags needed for all packages that build with GCC? Should this be moved into tools_def.txt? Mike > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Cheng-Chieh Huang via groups.io > Sent: Wednesday, July 21, 2021 6:23 AM > To: devel@edk2.groups.io > Cc: Cheng-Chieh Huang <chengchieh@google.com> > Subject: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation > > This will allow we compile payload using gcc8 > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> > --- > UefiPayloadPkg/UefiPayloadPkg.dsc | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc > index 8aa5f18cd35c..fa41c5a24af5 100644 > --- a/UefiPayloadPkg/UefiPayloadPkg.dsc > +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc > @@ -30,6 +30,8 @@ [Defines] > DEFINE PS2_KEYBOARD_ENABLE = FALSE > DEFINE UNIVERSAL_PAYLOAD = FALSE > > + DEFINE DISABLE_MMX_SSE = FALSE > + > # > # SBL: UEFI payload for Slim Bootloader > # COREBOOT: UEFI payload for coreboot > @@ -96,6 +98,9 @@ [BuildOptions] > *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES > !if $(BOOTLOADER) == "LINUXBOOT" > *_*_*_CC_FLAGS = -D LINUXBOOT_PAYLOAD > +!endif > +!if $(DISABLE_MMX_SSE) > + *_*_*_CC_FLAGS = -mno-mmx -mno-sse > !endif > GCC:*_UNIXGCC_*_CC_FLAGS = -DMDEPKG_NDEBUG > GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG > -- > 2.32.0.402.g57bb445576-goog > > > > > ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation 2021-07-21 16:34 ` [edk2-devel] " Michael D Kinney @ 2021-07-21 17:42 ` Cheng-Chieh Huang 2021-07-22 1:28 ` 回复: " gaoliming 0 siblings, 1 reply; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-21 17:42 UTC (permalink / raw) To: Kinney, Michael D; +Cc: devel [-- Attachment #1: Type: text/plain, Size: 1973 bytes --] Yes, we can. I will drop this patch for this uefipayload batch and send another one for support DISABLE_GCC_MMX_SSE in tools_de.txt. -- Cheng-Chieh On Thu, Jul 22, 2021, 12:35 AM Kinney, Michael D <michael.d.kinney@intel.com> wrote: > Are those flags needed for all packages that build with GCC? > > Should this be moved into tools_def.txt? > > Mike > > > -----Original Message----- > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of > Cheng-Chieh Huang via groups.io > > Sent: Wednesday, July 21, 2021 6:23 AM > > To: devel@edk2.groups.io > > Cc: Cheng-Chieh Huang <chengchieh@google.com> > > Subject: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE > to avoid generating floating points operation > > > > This will allow we compile payload using gcc8 > > > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> > > --- > > UefiPayloadPkg/UefiPayloadPkg.dsc | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc > b/UefiPayloadPkg/UefiPayloadPkg.dsc > > index 8aa5f18cd35c..fa41c5a24af5 100644 > > --- a/UefiPayloadPkg/UefiPayloadPkg.dsc > > +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc > > @@ -30,6 +30,8 @@ [Defines] > > DEFINE PS2_KEYBOARD_ENABLE = FALSE > > DEFINE UNIVERSAL_PAYLOAD = FALSE > > > > + DEFINE DISABLE_MMX_SSE = FALSE > > + > > # > > # SBL: UEFI payload for Slim Bootloader > > # COREBOOT: UEFI payload for coreboot > > @@ -96,6 +98,9 @@ [BuildOptions] > > *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES > > !if $(BOOTLOADER) == "LINUXBOOT" > > *_*_*_CC_FLAGS = -D LINUXBOOT_PAYLOAD > > +!endif > > +!if $(DISABLE_MMX_SSE) > > + *_*_*_CC_FLAGS = -mno-mmx -mno-sse > > !endif > > GCC:*_UNIXGCC_*_CC_FLAGS = -DMDEPKG_NDEBUG > > GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG > > -- > > 2.32.0.402.g57bb445576-goog > > > > > > > > > > > > [-- Attachment #2: Type: text/html, Size: 3186 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* 回复: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation 2021-07-21 17:42 ` Cheng-Chieh Huang @ 2021-07-22 1:28 ` gaoliming 2021-07-22 2:35 ` Cheng-Chieh Huang 0 siblings, 1 reply; 33+ messages in thread From: gaoliming @ 2021-07-22 1:28 UTC (permalink / raw) To: devel, chengchieh, 'Kinney, Michael D' [-- Attachment #1: Type: text/plain, Size: 2765 bytes --] Tools_def.txt doesn’t support build flag DISABLE_GCC_MMX_SSE. If this flag is moved into BaseTools\Conf\tools_def.template, -mno-mmx -mno-sse option will be the default GCC options. That means all platforms will apply them. Thanks Liming 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Cheng-Chieh Huang via groups.io 发送时间: 2021年7月22日 1:43 收件人: Kinney, Michael D <michael.d.kinney@intel.com> 抄送: devel@edk2.groups.io 主题: Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation Yes, we can. I will drop this patch for this uefipayload batch and send another one for support DISABLE_GCC_MMX_SSE in tools_de.txt. -- Cheng-Chieh On Thu, Jul 22, 2021, 12:35 AM Kinney, Michael D <michael.d.kinney@intel.com <mailto:michael.d.kinney@intel.com> > wrote: Are those flags needed for all packages that build with GCC? Should this be moved into tools_def.txt? Mike > -----Original Message----- > From: devel@edk2.groups.io <mailto:devel@edk2.groups.io> <devel@edk2.groups.io <mailto:devel@edk2.groups.io> > On Behalf Of Cheng-Chieh Huang via groups.io <http://groups.io> > Sent: Wednesday, July 21, 2021 6:23 AM > To: devel@edk2.groups.io <mailto:devel@edk2.groups.io> > Cc: Cheng-Chieh Huang <chengchieh@google.com <mailto:chengchieh@google.com> > > Subject: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation > > This will allow we compile payload using gcc8 > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com <mailto:chengchieh@google.com> > > --- > UefiPayloadPkg/UefiPayloadPkg.dsc | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc > index 8aa5f18cd35c..fa41c5a24af5 100644 > --- a/UefiPayloadPkg/UefiPayloadPkg.dsc > +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc > @@ -30,6 +30,8 @@ [Defines] > DEFINE PS2_KEYBOARD_ENABLE = FALSE > DEFINE UNIVERSAL_PAYLOAD = FALSE > > + DEFINE DISABLE_MMX_SSE = FALSE > + > # > # SBL: UEFI payload for Slim Bootloader > # COREBOOT: UEFI payload for coreboot > @@ -96,6 +98,9 @@ [BuildOptions] > *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES > !if $(BOOTLOADER) == "LINUXBOOT" > *_*_*_CC_FLAGS = -D LINUXBOOT_PAYLOAD > +!endif > +!if $(DISABLE_MMX_SSE) > + *_*_*_CC_FLAGS = -mno-mmx -mno-sse > !endif > GCC:*_UNIXGCC_*_CC_FLAGS = -DMDEPKG_NDEBUG > GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG > -- > 2.32.0.402.g57bb445576-goog > > > > > [-- Attachment #2: Type: text/html, Size: 7471 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation 2021-07-22 1:28 ` 回复: " gaoliming @ 2021-07-22 2:35 ` Cheng-Chieh Huang 2021-07-23 10:28 ` 回复: " gaoliming 0 siblings, 1 reply; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-22 2:35 UTC (permalink / raw) To: gaoliming; +Cc: devel, Kinney, Michael D [-- Attachment #1: Type: text/plain, Size: 2915 bytes --] I mean, I will submit a patch to support DISABLE_GCC_MMX_SSE in tools_def. What do you think? -- Cheng-Chieh On Thu, Jul 22, 2021 at 9:28 AM gaoliming <gaoliming@byosoft.com.cn> wrote: > Tools_def.txt doesn’t support build flag DISABLE_GCC_MMX_SSE. If this > flag is moved into BaseTools\Conf\tools_def.template, -mno-mmx -mno-sse > option will be the default GCC options. That means all platforms will apply > them. > > > > Thanks > > Liming > > *发件人:* devel@edk2.groups.io <devel@edk2.groups.io> *代表 *Cheng-Chieh Huang > via groups.io > *发送时间:* 2021年7月22日 1:43 > *收件人:* Kinney, Michael D <michael.d.kinney@intel.com> > *抄送:* devel@edk2.groups.io > *主题:* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE > to avoid generating floating points operation > > > > Yes, we can. I will drop this patch for this uefipayload batch and send > another one for support DISABLE_GCC_MMX_SSE in tools_de.txt. > > > > -- > > Cheng-Chieh > > On Thu, Jul 22, 2021, 12:35 AM Kinney, Michael D < > michael.d.kinney@intel.com> wrote: > > Are those flags needed for all packages that build with GCC? > > Should this be moved into tools_def.txt? > > Mike > > > -----Original Message----- > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of > Cheng-Chieh Huang via groups.io > > Sent: Wednesday, July 21, 2021 6:23 AM > > To: devel@edk2.groups.io > > Cc: Cheng-Chieh Huang <chengchieh@google.com> > > Subject: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE > to avoid generating floating points operation > > > > This will allow we compile payload using gcc8 > > > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> > > --- > > UefiPayloadPkg/UefiPayloadPkg.dsc | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc > b/UefiPayloadPkg/UefiPayloadPkg.dsc > > index 8aa5f18cd35c..fa41c5a24af5 100644 > > --- a/UefiPayloadPkg/UefiPayloadPkg.dsc > > +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc > > @@ -30,6 +30,8 @@ [Defines] > > DEFINE PS2_KEYBOARD_ENABLE = FALSE > > DEFINE UNIVERSAL_PAYLOAD = FALSE > > > > + DEFINE DISABLE_MMX_SSE = FALSE > > + > > # > > # SBL: UEFI payload for Slim Bootloader > > # COREBOOT: UEFI payload for coreboot > > @@ -96,6 +98,9 @@ [BuildOptions] > > *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES > > !if $(BOOTLOADER) == "LINUXBOOT" > > *_*_*_CC_FLAGS = -D LINUXBOOT_PAYLOAD > > +!endif > > +!if $(DISABLE_MMX_SSE) > > + *_*_*_CC_FLAGS = -mno-mmx -mno-sse > > !endif > > GCC:*_UNIXGCC_*_CC_FLAGS = -DMDEPKG_NDEBUG > > GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG > > -- > > 2.32.0.402.g57bb445576-goog > > > > > > > > > > > > > [-- Attachment #2: Type: text/html, Size: 6463 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* 回复: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation 2021-07-22 2:35 ` Cheng-Chieh Huang @ 2021-07-23 10:28 ` gaoliming 2021-07-23 11:16 ` Cheng-Chieh Huang 0 siblings, 1 reply; 33+ messages in thread From: gaoliming @ 2021-07-23 10:28 UTC (permalink / raw) To: 'Cheng-Chieh Huang'; +Cc: devel, 'Kinney, Michael D' [-- Attachment #1: Type: text/plain, Size: 3611 bytes --] How do you add this support in tools_def? Can you give the proposal for it? Thanks Liming 发件人: Cheng-Chieh Huang <chengchieh@google.com> 发送时间: 2021年7月22日 10:35 收件人: gaoliming <gaoliming@byosoft.com.cn> 抄送: devel@edk2.groups.io; Kinney, Michael D <michael.d.kinney@intel.com> 主题: Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation I mean, I will submit a patch to support DISABLE_GCC_MMX_SSE in tools_def. What do you think? -- Cheng-Chieh On Thu, Jul 22, 2021 at 9:28 AM gaoliming <gaoliming@byosoft.com.cn <mailto:gaoliming@byosoft.com.cn> > wrote: Tools_def.txt doesn’t support build flag DISABLE_GCC_MMX_SSE. If this flag is moved into BaseTools\Conf\tools_def.template, -mno-mmx -mno-sse option will be the default GCC options. That means all platforms will apply them. Thanks Liming 发件人: devel@edk2.groups.io <mailto:devel@edk2.groups.io> <devel@edk2.groups.io <mailto:devel@edk2.groups.io> > 代表 Cheng-Chieh Huang via groups.io <http://groups.io> 发送时间: 2021年7月22日 1:43 收件人: Kinney, Michael D <michael.d.kinney@intel.com <mailto:michael.d.kinney@intel.com> > 抄送: devel@edk2.groups.io <mailto:devel@edk2.groups.io> 主题: Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation Yes, we can. I will drop this patch for this uefipayload batch and send another one for support DISABLE_GCC_MMX_SSE in tools_de.txt. -- Cheng-Chieh On Thu, Jul 22, 2021, 12:35 AM Kinney, Michael D <michael.d.kinney@intel.com <mailto:michael.d.kinney@intel.com> > wrote: Are those flags needed for all packages that build with GCC? Should this be moved into tools_def.txt? Mike > -----Original Message----- > From: devel@edk2.groups.io <mailto:devel@edk2.groups.io> <devel@edk2.groups.io <mailto:devel@edk2.groups.io> > On Behalf Of Cheng-Chieh Huang via groups.io <http://groups.io> > Sent: Wednesday, July 21, 2021 6:23 AM > To: devel@edk2.groups.io <mailto:devel@edk2.groups.io> > Cc: Cheng-Chieh Huang <chengchieh@google.com <mailto:chengchieh@google.com> > > Subject: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation > > This will allow we compile payload using gcc8 > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com <mailto:chengchieh@google.com> > > --- > UefiPayloadPkg/UefiPayloadPkg.dsc | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc > index 8aa5f18cd35c..fa41c5a24af5 100644 > --- a/UefiPayloadPkg/UefiPayloadPkg.dsc > +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc > @@ -30,6 +30,8 @@ [Defines] > DEFINE PS2_KEYBOARD_ENABLE = FALSE > DEFINE UNIVERSAL_PAYLOAD = FALSE > > + DEFINE DISABLE_MMX_SSE = FALSE > + > # > # SBL: UEFI payload for Slim Bootloader > # COREBOOT: UEFI payload for coreboot > @@ -96,6 +98,9 @@ [BuildOptions] > *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES > !if $(BOOTLOADER) == "LINUXBOOT" > *_*_*_CC_FLAGS = -D LINUXBOOT_PAYLOAD > +!endif > +!if $(DISABLE_MMX_SSE) > + *_*_*_CC_FLAGS = -mno-mmx -mno-sse > !endif > GCC:*_UNIXGCC_*_CC_FLAGS = -DMDEPKG_NDEBUG > GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG > -- > 2.32.0.402.g57bb445576-goog > > > > > [-- Attachment #2: Type: text/html, Size: 11141 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation 2021-07-23 10:28 ` 回复: " gaoliming @ 2021-07-23 11:16 ` Cheng-Chieh Huang 2021-07-23 16:45 ` Michael D Kinney 0 siblings, 1 reply; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-23 11:16 UTC (permalink / raw) To: gaoliming; +Cc: devel, Kinney, Michael D [-- Attachment #1: Type: text/plain, Size: 4016 bytes --] I got what you mean by "Tools_def.txt doesn’t support build flag" now. I thought the parser does support some sort of if/else condition, but it seems to be not the case. Alternatively, we can do this during the copy (from template to tools_def.txt), but everytime we need to recreate tools_def.txt which is not ideal). In that case, I think we should just roll back to only doing this in UefiPayloadPkg.dsc. If other packs want to add these flags, they will need to do it on their own. On Fri, Jul 23, 2021 at 6:29 PM gaoliming <gaoliming@byosoft.com.cn> wrote: > How do you add this support in tools_def? Can you give the proposal for it? > > > > Thanks > > Liming > > *发件人:* Cheng-Chieh Huang <chengchieh@google.com> > *发送时间:* 2021年7月22日 10:35 > *收件人:* gaoliming <gaoliming@byosoft.com.cn> > *抄送:* devel@edk2.groups.io; Kinney, Michael D <michael.d.kinney@intel.com> > *主题:* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE > to avoid generating floating points operation > > > > I mean, I will submit a patch to support DISABLE_GCC_MMX_SSE in tools_def. > What do you think? > > > > -- > > Cheng-Chieh > > > > On Thu, Jul 22, 2021 at 9:28 AM gaoliming <gaoliming@byosoft.com.cn> > wrote: > > Tools_def.txt doesn’t support build flag DISABLE_GCC_MMX_SSE. If this > flag is moved into BaseTools\Conf\tools_def.template, -mno-mmx -mno-sse > option will be the default GCC options. That means all platforms will apply > them. > > > > Thanks > > Liming > > *发件人:* devel@edk2.groups.io <devel@edk2.groups.io> *代表 *Cheng-Chieh Huang > via groups.io > *发送时间:* 2021年7月22日 1:43 > *收件人:* Kinney, Michael D <michael.d.kinney@intel.com> > *抄送:* devel@edk2.groups.io > *主题:* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE > to avoid generating floating points operation > > > > Yes, we can. I will drop this patch for this uefipayload batch and send > another one for support DISABLE_GCC_MMX_SSE in tools_de.txt. > > > > -- > > Cheng-Chieh > > On Thu, Jul 22, 2021, 12:35 AM Kinney, Michael D < > michael.d.kinney@intel.com> wrote: > > Are those flags needed for all packages that build with GCC? > > Should this be moved into tools_def.txt? > > Mike > > > -----Original Message----- > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of > Cheng-Chieh Huang via groups.io > > Sent: Wednesday, July 21, 2021 6:23 AM > > To: devel@edk2.groups.io > > Cc: Cheng-Chieh Huang <chengchieh@google.com> > > Subject: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE > to avoid generating floating points operation > > > > This will allow we compile payload using gcc8 > > > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> > > --- > > UefiPayloadPkg/UefiPayloadPkg.dsc | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc > b/UefiPayloadPkg/UefiPayloadPkg.dsc > > index 8aa5f18cd35c..fa41c5a24af5 100644 > > --- a/UefiPayloadPkg/UefiPayloadPkg.dsc > > +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc > > @@ -30,6 +30,8 @@ [Defines] > > DEFINE PS2_KEYBOARD_ENABLE = FALSE > > DEFINE UNIVERSAL_PAYLOAD = FALSE > > > > + DEFINE DISABLE_MMX_SSE = FALSE > > + > > # > > # SBL: UEFI payload for Slim Bootloader > > # COREBOOT: UEFI payload for coreboot > > @@ -96,6 +98,9 @@ [BuildOptions] > > *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES > > !if $(BOOTLOADER) == "LINUXBOOT" > > *_*_*_CC_FLAGS = -D LINUXBOOT_PAYLOAD > > +!endif > > +!if $(DISABLE_MMX_SSE) > > + *_*_*_CC_FLAGS = -mno-mmx -mno-sse > > !endif > > GCC:*_UNIXGCC_*_CC_FLAGS = -DMDEPKG_NDEBUG > > GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG > > -- > > 2.32.0.402.g57bb445576-goog > > > > > > > > > > > > > > [-- Attachment #2: Type: text/html, Size: 9938 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation 2021-07-23 11:16 ` Cheng-Chieh Huang @ 2021-07-23 16:45 ` Michael D Kinney 2021-07-23 17:17 ` Cheng-Chieh Huang 0 siblings, 1 reply; 33+ messages in thread From: Michael D Kinney @ 2021-07-23 16:45 UTC (permalink / raw) To: Cheng-Chieh Huang, gaoliming, Kinney, Michael D; +Cc: devel@edk2.groups.io [-- Attachment #1: Type: text/plain, Size: 5144 bytes --] Can you provide details on why this flag was needed in the UefiPayloadPkg use case? If the newer versions of the GCC compilers are injecting use of MMX/SSE instructions from optimization of C code, then we need to unconditionally disable that usage in tools_def.txt. The only place MMX/SSE instructions can be used is in NASM files with proper save/restore of the MMX/SSE state. Here is an example with use of xmm0 that is saved/restored on the stack. https://github.com/tianocore/edk2/blob/master/MdePkg/Library/BaseMemoryLibSse2/X64/CopyMem.nasm Mike From: Cheng-Chieh Huang <chengchieh@google.com> Sent: Friday, July 23, 2021 4:17 AM To: gaoliming <gaoliming@byosoft.com.cn> Cc: devel@edk2.groups.io; Kinney, Michael D <michael.d.kinney@intel.com> Subject: Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation I got what you mean by "Tools_def.txt doesn’t support build flag" now. I thought the parser does support some sort of if/else condition, but it seems to be not the case. Alternatively, we can do this during the copy (from template to tools_def.txt), but everytime we need to recreate tools_def.txt which is not ideal). In that case, I think we should just roll back to only doing this in UefiPayloadPkg.dsc. If other packs want to add these flags, they will need to do it on their own. On Fri, Jul 23, 2021 at 6:29 PM gaoliming <gaoliming@byosoft.com.cn<mailto:gaoliming@byosoft.com.cn>> wrote: How do you add this support in tools_def? Can you give the proposal for it? Thanks Liming 发件人: Cheng-Chieh Huang <chengchieh@google.com<mailto:chengchieh@google.com>> 发送时间: 2021年7月22日 10:35 收件人: gaoliming <gaoliming@byosoft.com.cn<mailto:gaoliming@byosoft.com.cn>> 抄送: devel@edk2.groups.io<mailto:devel@edk2.groups.io>; Kinney, Michael D <michael.d.kinney@intel.com<mailto:michael.d.kinney@intel.com>> 主题: Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation I mean, I will submit a patch to support DISABLE_GCC_MMX_SSE in tools_def. What do you think? -- Cheng-Chieh On Thu, Jul 22, 2021 at 9:28 AM gaoliming <gaoliming@byosoft.com.cn<mailto:gaoliming@byosoft.com.cn>> wrote: Tools_def.txt doesn’t support build flag DISABLE_GCC_MMX_SSE. If this flag is moved into BaseTools\Conf\tools_def.template, -mno-mmx -mno-sse option will be the default GCC options. That means all platforms will apply them. Thanks Liming 发件人: devel@edk2.groups.io<mailto:devel@edk2.groups.io> <devel@edk2.groups.io<mailto:devel@edk2.groups.io>> 代表 Cheng-Chieh Huang via groups.io<http://groups.io> 发送时间: 2021年7月22日 1:43 收件人: Kinney, Michael D <michael.d.kinney@intel.com<mailto:michael.d.kinney@intel.com>> 抄送: devel@edk2.groups.io<mailto:devel@edk2.groups.io> 主题: Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation Yes, we can. I will drop this patch for this uefipayload batch and send another one for support DISABLE_GCC_MMX_SSE in tools_de.txt. -- Cheng-Chieh On Thu, Jul 22, 2021, 12:35 AM Kinney, Michael D <michael.d.kinney@intel.com<mailto:michael.d.kinney@intel.com>> wrote: Are those flags needed for all packages that build with GCC? Should this be moved into tools_def.txt? Mike > -----Original Message----- > From: devel@edk2.groups.io<mailto:devel@edk2.groups.io> <devel@edk2.groups.io<mailto:devel@edk2.groups.io>> On Behalf Of Cheng-Chieh Huang via groups.io<http://groups.io> > Sent: Wednesday, July 21, 2021 6:23 AM > To: devel@edk2.groups.io<mailto:devel@edk2.groups.io> > Cc: Cheng-Chieh Huang <chengchieh@google.com<mailto:chengchieh@google.com>> > Subject: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation > > This will allow we compile payload using gcc8 > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com<mailto:chengchieh@google.com>> > --- > UefiPayloadPkg/UefiPayloadPkg.dsc | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc > index 8aa5f18cd35c..fa41c5a24af5 100644 > --- a/UefiPayloadPkg/UefiPayloadPkg.dsc > +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc > @@ -30,6 +30,8 @@ [Defines] > DEFINE PS2_KEYBOARD_ENABLE = FALSE > DEFINE UNIVERSAL_PAYLOAD = FALSE > > + DEFINE DISABLE_MMX_SSE = FALSE > + > # > # SBL: UEFI payload for Slim Bootloader > # COREBOOT: UEFI payload for coreboot > @@ -96,6 +98,9 @@ [BuildOptions] > *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES > !if $(BOOTLOADER) == "LINUXBOOT" > *_*_*_CC_FLAGS = -D LINUXBOOT_PAYLOAD > +!endif > +!if $(DISABLE_MMX_SSE) > + *_*_*_CC_FLAGS = -mno-mmx -mno-sse > !endif > GCC:*_UNIXGCC_*_CC_FLAGS = -DMDEPKG_NDEBUG > GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG > -- > 2.32.0.402.g57bb445576-goog > > > > > [-- Attachment #2: Type: text/html, Size: 53402 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation 2021-07-23 16:45 ` Michael D Kinney @ 2021-07-23 17:17 ` Cheng-Chieh Huang 2021-07-23 18:38 ` Michael D Kinney 0 siblings, 1 reply; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-23 17:17 UTC (permalink / raw) To: Kinney, Michael D; +Cc: gaoliming, devel@edk2.groups.io [-- Attachment #1: Type: text/plain, Size: 5944 bytes --] Hi, This is not about UefiPayload. I did not have GCC5 in my environment, so I use a newer GCC to compile. However, in newer gcc (let's say GCC8), it generates floating point instructions in each function and system will crash as you mentioned that we did not handle it in UEFI. I uploaded this patch because many people from our group use newer GCC and it will be more convenient if we can disable it with a flag (otherwise, we need to maintain a local patch). I guess the real fix (bigger work) is for EDK2 to support the newer GCC version in its toolchain (create something like *_GCC8_*). Back to the question, I think it should be no harm to add these flags to tool_defs.txt if EDK2 did not expect the compiler to generate MMX/SSE instructions in the first place. -- Cheng-Chieh On Sat, Jul 24, 2021 at 12:46 AM Kinney, Michael D < michael.d.kinney@intel.com> wrote: > Can you provide details on why this flag was needed in the UefiPayloadPkg > use case? > > > > If the newer versions of the GCC compilers are injecting use of MMX/SSE > instructions from optimization of C code, then we need to unconditionally > disable that usage in tools_def.txt. The only place MMX/SSE instructions > can be used is in NASM files with proper save/restore of the MMX/SSE state. > > > > Here is an example with use of xmm0 that is saved/restored on the stack. > > > > > https://github.com/tianocore/edk2/blob/master/MdePkg/Library/BaseMemoryLibSse2/X64/CopyMem.nasm > > > > Mike > > > > *From:* Cheng-Chieh Huang <chengchieh@google.com> > *Sent:* Friday, July 23, 2021 4:17 AM > *To:* gaoliming <gaoliming@byosoft.com.cn> > *Cc:* devel@edk2.groups.io; Kinney, Michael D <michael.d.kinney@intel.com> > *Subject:* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add > DISABLE_MMX_SSE to avoid generating floating points operation > > > > I got what you mean by "Tools_def.txt doesn’t support build flag" now. I > thought the parser does support some sort of if/else condition, but it > seems to be not the case. Alternatively, we can do this during the copy > (from template to tools_def.txt), but everytime we need to recreate > tools_def.txt which is not ideal). > > > > In that case, I think we should just roll back to only doing this in > UefiPayloadPkg.dsc. If other packs want to add these flags, they will need > to do it on their own. > > > > On Fri, Jul 23, 2021 at 6:29 PM gaoliming <gaoliming@byosoft.com.cn> > wrote: > > How do you add this support in tools_def? Can you give the proposal for it? > > > > Thanks > > Liming > > *发件人**:* Cheng-Chieh Huang <chengchieh@google.com> > *发送时间:* 2021年7月22日 10:35 > *收件人:* gaoliming <gaoliming@byosoft.com.cn> > *抄送:* devel@edk2.groups.io; Kinney, Michael D <michael.d.kinney@intel.com> > *主题:* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE > to avoid generating floating points operation > > > > I mean, I will submit a patch to support DISABLE_GCC_MMX_SSE in tools_def. > What do you think? > > > > -- > > Cheng-Chieh > > > > On Thu, Jul 22, 2021 at 9:28 AM gaoliming <gaoliming@byosoft.com.cn> > wrote: > > Tools_def.txt doesn’t support build flag DISABLE_GCC_MMX_SSE. If this > flag is moved into BaseTools\Conf\tools_def.template, -mno-mmx -mno-sse > option will be the default GCC options. That means all platforms will apply > them. > > > > Thanks > > Liming > > *发件人**:* devel@edk2.groups.io <devel@edk2.groups.io> *代表 *Cheng-Chieh > Huang via groups.io > *发送时间:* 2021年7月22日 1:43 > *收件人:* Kinney, Michael D <michael.d.kinney@intel.com> > *抄送:* devel@edk2.groups.io > *主题:* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE > to avoid generating floating points operation > > > > Yes, we can. I will drop this patch for this uefipayload batch and send > another one for support DISABLE_GCC_MMX_SSE in tools_de.txt. > > > > -- > > Cheng-Chieh > > On Thu, Jul 22, 2021, 12:35 AM Kinney, Michael D < > michael.d.kinney@intel.com> wrote: > > Are those flags needed for all packages that build with GCC? > > Should this be moved into tools_def.txt? > > Mike > > > -----Original Message----- > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of > Cheng-Chieh Huang via groups.io > > Sent: Wednesday, July 21, 2021 6:23 AM > > To: devel@edk2.groups.io > > Cc: Cheng-Chieh Huang <chengchieh@google.com> > > Subject: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE > to avoid generating floating points operation > > > > This will allow we compile payload using gcc8 > > > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> > > --- > > UefiPayloadPkg/UefiPayloadPkg.dsc | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc > b/UefiPayloadPkg/UefiPayloadPkg.dsc > > index 8aa5f18cd35c..fa41c5a24af5 100644 > > --- a/UefiPayloadPkg/UefiPayloadPkg.dsc > > +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc > > @@ -30,6 +30,8 @@ [Defines] > > DEFINE PS2_KEYBOARD_ENABLE = FALSE > > DEFINE UNIVERSAL_PAYLOAD = FALSE > > > > + DEFINE DISABLE_MMX_SSE = FALSE > > + > > # > > # SBL: UEFI payload for Slim Bootloader > > # COREBOOT: UEFI payload for coreboot > > @@ -96,6 +98,9 @@ [BuildOptions] > > *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES > > !if $(BOOTLOADER) == "LINUXBOOT" > > *_*_*_CC_FLAGS = -D LINUXBOOT_PAYLOAD > > +!endif > > +!if $(DISABLE_MMX_SSE) > > + *_*_*_CC_FLAGS = -mno-mmx -mno-sse > > !endif > > GCC:*_UNIXGCC_*_CC_FLAGS = -DMDEPKG_NDEBUG > > GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG > > -- > > 2.32.0.402.g57bb445576-goog > > > > > > > > > > > > > > [-- Attachment #2: Type: text/html, Size: 13221 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation 2021-07-23 17:17 ` Cheng-Chieh Huang @ 2021-07-23 18:38 ` Michael D Kinney 0 siblings, 0 replies; 33+ messages in thread From: Michael D Kinney @ 2021-07-23 18:38 UTC (permalink / raw) To: Cheng-Chieh Huang, Kinney, Michael D; +Cc: gaoliming, devel@edk2.groups.io [-- Attachment #1: Type: text/plain, Size: 6671 bytes --] As long as those flags are supported or ignored by the GCC5 compilers, then there should be not harm in adding them to the GCC5 profile. Mike From: Cheng-Chieh Huang <chengchieh@google.com> Sent: Friday, July 23, 2021 10:17 AM To: Kinney, Michael D <michael.d.kinney@intel.com> Cc: gaoliming <gaoliming@byosoft.com.cn>; devel@edk2.groups.io Subject: Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation Hi, This is not about UefiPayload. I did not have GCC5 in my environment, so I use a newer GCC to compile. However, in newer gcc (let's say GCC8), it generates floating point instructions in each function and system will crash as you mentioned that we did not handle it in UEFI. I uploaded this patch because many people from our group use newer GCC and it will be more convenient if we can disable it with a flag (otherwise, we need to maintain a local patch). I guess the real fix (bigger work) is for EDK2 to support the newer GCC version in its toolchain (create something like *_GCC8_*). Back to the question, I think it should be no harm to add these flags to tool_defs.txt if EDK2 did not expect the compiler to generate MMX/SSE instructions in the first place. -- Cheng-Chieh On Sat, Jul 24, 2021 at 12:46 AM Kinney, Michael D <michael.d.kinney@intel.com<mailto:michael.d.kinney@intel.com>> wrote: Can you provide details on why this flag was needed in the UefiPayloadPkg use case? If the newer versions of the GCC compilers are injecting use of MMX/SSE instructions from optimization of C code, then we need to unconditionally disable that usage in tools_def.txt. The only place MMX/SSE instructions can be used is in NASM files with proper save/restore of the MMX/SSE state. Here is an example with use of xmm0 that is saved/restored on the stack. https://github.com/tianocore/edk2/blob/master/MdePkg/Library/BaseMemoryLibSse2/X64/CopyMem.nasm Mike From: Cheng-Chieh Huang <chengchieh@google.com<mailto:chengchieh@google.com>> Sent: Friday, July 23, 2021 4:17 AM To: gaoliming <gaoliming@byosoft.com.cn<mailto:gaoliming@byosoft.com.cn>> Cc: devel@edk2.groups.io<mailto:devel@edk2.groups.io>; Kinney, Michael D <michael.d.kinney@intel.com<mailto:michael.d.kinney@intel.com>> Subject: Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation I got what you mean by "Tools_def.txt doesn’t support build flag" now. I thought the parser does support some sort of if/else condition, but it seems to be not the case. Alternatively, we can do this during the copy (from template to tools_def.txt), but everytime we need to recreate tools_def.txt which is not ideal). In that case, I think we should just roll back to only doing this in UefiPayloadPkg.dsc. If other packs want to add these flags, they will need to do it on their own. On Fri, Jul 23, 2021 at 6:29 PM gaoliming <gaoliming@byosoft.com.cn<mailto:gaoliming@byosoft.com.cn>> wrote: How do you add this support in tools_def? Can you give the proposal for it? Thanks Liming 发件人: Cheng-Chieh Huang <chengchieh@google.com<mailto:chengchieh@google.com>> 发送时间: 2021年7月22日 10:35 收件人: gaoliming <gaoliming@byosoft.com.cn<mailto:gaoliming@byosoft.com.cn>> 抄送: devel@edk2.groups.io<mailto:devel@edk2.groups.io>; Kinney, Michael D <michael.d.kinney@intel.com<mailto:michael.d.kinney@intel.com>> 主题: Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation I mean, I will submit a patch to support DISABLE_GCC_MMX_SSE in tools_def. What do you think? -- Cheng-Chieh On Thu, Jul 22, 2021 at 9:28 AM gaoliming <gaoliming@byosoft.com.cn<mailto:gaoliming@byosoft.com.cn>> wrote: Tools_def.txt doesn’t support build flag DISABLE_GCC_MMX_SSE. If this flag is moved into BaseTools\Conf\tools_def.template, -mno-mmx -mno-sse option will be the default GCC options. That means all platforms will apply them. Thanks Liming 发件人: devel@edk2.groups.io<mailto:devel@edk2.groups.io> <devel@edk2.groups.io<mailto:devel@edk2.groups.io>> 代表 Cheng-Chieh Huang via groups.io<http://groups.io> 发送时间: 2021年7月22日 1:43 收件人: Kinney, Michael D <michael.d.kinney@intel.com<mailto:michael.d.kinney@intel.com>> 抄送: devel@edk2.groups.io<mailto:devel@edk2.groups.io> 主题: Re: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation Yes, we can. I will drop this patch for this uefipayload batch and send another one for support DISABLE_GCC_MMX_SSE in tools_de.txt. -- Cheng-Chieh On Thu, Jul 22, 2021, 12:35 AM Kinney, Michael D <michael.d.kinney@intel.com<mailto:michael.d.kinney@intel.com>> wrote: Are those flags needed for all packages that build with GCC? Should this be moved into tools_def.txt? Mike > -----Original Message----- > From: devel@edk2.groups.io<mailto:devel@edk2.groups.io> <devel@edk2.groups.io<mailto:devel@edk2.groups.io>> On Behalf Of Cheng-Chieh Huang via groups.io<http://groups.io> > Sent: Wednesday, July 21, 2021 6:23 AM > To: devel@edk2.groups.io<mailto:devel@edk2.groups.io> > Cc: Cheng-Chieh Huang <chengchieh@google.com<mailto:chengchieh@google.com>> > Subject: [edk2-devel] [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation > > This will allow we compile payload using gcc8 > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com<mailto:chengchieh@google.com>> > --- > UefiPayloadPkg/UefiPayloadPkg.dsc | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc > index 8aa5f18cd35c..fa41c5a24af5 100644 > --- a/UefiPayloadPkg/UefiPayloadPkg.dsc > +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc > @@ -30,6 +30,8 @@ [Defines] > DEFINE PS2_KEYBOARD_ENABLE = FALSE > DEFINE UNIVERSAL_PAYLOAD = FALSE > > + DEFINE DISABLE_MMX_SSE = FALSE > + > # > # SBL: UEFI payload for Slim Bootloader > # COREBOOT: UEFI payload for coreboot > @@ -96,6 +98,9 @@ [BuildOptions] > *_*_*_CC_FLAGS = -D DISABLE_NEW_DEPRECATED_INTERFACES > !if $(BOOTLOADER) == "LINUXBOOT" > *_*_*_CC_FLAGS = -D LINUXBOOT_PAYLOAD > +!endif > +!if $(DISABLE_MMX_SSE) > + *_*_*_CC_FLAGS = -mno-mmx -mno-sse > !endif > GCC:*_UNIXGCC_*_CC_FLAGS = -DMDEPKG_NDEBUG > GCC:RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG > -- > 2.32.0.402.g57bb445576-goog > > > > > [-- Attachment #2: Type: text/html, Size: 57333 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* [PATCH v1 6/6] UefiPayloadPkg: LinuxBoot: use a text format for the configuration block. 2021-07-21 13:23 [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload Cheng-Chieh Huang ` (4 preceding siblings ...) 2021-07-21 13:23 ` [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation Cheng-Chieh Huang @ 2021-07-21 13:23 ` Cheng-Chieh Huang 2021-07-21 17:09 ` [edk2-devel] " Marvin Häuser 2021-08-04 3:00 ` Guo Dong 2021-07-22 1:29 ` 回复: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload gaoliming 2021-07-22 1:44 ` Ni, Ray 7 siblings, 2 replies; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-21 13:23 UTC (permalink / raw) To: devel; +Cc: Trammell Hudson, Cheng-Chieh Huang From: Trammell Hudson <hudson@trmm.net> This adds a text command line for the UefiPayloadPkg that uses a textual magic number 'LnxBoot1' and a series of white-space separated key=value[,value...] pairs for the parameters. The v1 binary configuration structure is used if it is present instead for backwards compatability. Currently supported text command line arguments are are: * `serial=baud,base,width,type,hz,pci` (only `baud` needs to be specified, the rest have reasonable defaults) * `mem=start,end,type` Types are based on `/sys/firmware/memmaps/*/types`: 1 == "System RAM" 3 == "ACPI Tables" 4 == "ACPI Non-volatile Storage" 5 == "Reserved" * `ACPI20=base` pointer to RDSP (from `/sys/firmware/efi/systab`) * `SMBIOS=base` pointer to the SMBIOS table (also from the EFI table) Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/Include/Linuxboot.h | 17 +- UefiPayloadPkg/Library/LbParseLib/LbParseLib.c | 252 +++++++++++++++++--- 2 files changed, 230 insertions(+), 39 deletions(-) diff --git a/UefiPayloadPkg/Include/Linuxboot.h b/UefiPayloadPkg/Include/Linuxboot.h index 34ca18069983..56b39b5a09ff 100644 --- a/UefiPayloadPkg/Include/Linuxboot.h +++ b/UefiPayloadPkg/Include/Linuxboot.h @@ -24,8 +24,7 @@ typedef struct MemoryMapEntryStruct { UINT32 Type; } MemoryMapEntry; -typedef struct UefiPayloadConfigStruct { - UINT64 Version; +typedef struct { UINT64 AcpiBase; UINT64 AcpiSize; UINT64 SmbiosBase; @@ -33,10 +32,22 @@ typedef struct UefiPayloadConfigStruct { SerialPortConfig SerialConfig; UINT32 NumMemoryMapEntries; MemoryMapEntry MemoryMapEntries[0]; +} UefiPayloadConfigV1; + +typedef struct UefiPayloadConfigStruct { + UINT64 Version; + union { + UefiPayloadConfigV1 v1; + struct { + char cmdline[0]; // up to 64 KB + } v2; + } config; } UefiPayloadConfig; #pragma pack() -#define UEFI_PAYLOAD_CONFIG_VERSION 1 +// magic version config is "LnxBoot1" +#define UEFI_PAYLOAD_CONFIG_VERSION1 1 +#define UEFI_PAYLOAD_CONFIG_VERSION2 0x31746f6f42786e4cULL #define LINUXBOOT_MEM_RAM 1 #define LINUXBOOT_MEM_DEFAULT 2 diff --git a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c index 34bfb6a1073f..5e68091cac91 100644 --- a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c +++ b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c @@ -1,13 +1,12 @@ /** @file - This library will parse the linuxboot table in memory and extract those required - information. + This library will parse the linuxboot table in memory and extract those +required information. Copyright (c) 2021, the u-root Authors. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ - #include <IndustryStandard/Acpi.h> #include <IndustryStandard/SmBios.h> #include <Library/BaseLib.h> @@ -18,17 +17,42 @@ #include <Library/PcdLib.h> #include <Linuxboot.h> #include <Uefi/UefiBaseType.h> +#include <stdint.h> +#include <stdlib.h> +//#include <string.h> +//#include <ctype.h> + +#define strncmp(a, b, n) AsciiStrnCmp((a), (b), (n)) + +static uint64_t parse_int(const char* s, char** end) { + UINT64 x; + + if (s[0] == '0' && s[1] == 'x') + AsciiStrHexToUint64S(s, end, &x); + else + AsciiStrDecimalToUint64S(s, end, &x); + + return x; +} + +static int isspace(const char c) { return c == ' ' || c == '\t' || c == '\n'; } // Retrieve UefiPayloadConfig from Linuxboot's uefiboot -UefiPayloadConfig* GetUefiPayLoadConfig() { - UefiPayloadConfig* config = +const UefiPayloadConfig* GetUefiPayLoadConfig() { + const UefiPayloadConfig* config = (UefiPayloadConfig*)(UINTN)(PcdGet32(PcdPayloadFdMemBase) - SIZE_64KB); - if (config->Version != UEFI_PAYLOAD_CONFIG_VERSION) { - DEBUG((DEBUG_ERROR, "Expect payload config version: %d, but get %d\n", - UEFI_PAYLOAD_CONFIG_VERSION, config->Version)); - CpuDeadLoop (); - } - return config; + + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1 || + config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) + return config; + + DEBUG((DEBUG_ERROR, + "Expect payload config version %016lx or %016lx, but get %016lx\n", + UEFI_PAYLOAD_CONFIG_VERSION1, UEFI_PAYLOAD_CONFIG_VERSION2, + config->Version)); + CpuDeadLoop(); + while (1) + ; } // Align the address and add memory rang to MemInfoCallback @@ -54,6 +78,57 @@ void AddMemoryRange(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN UINTN start, MemInfoCallback(&MemoryMap, NULL); } +const char* cmdline_next(const char* cmdline, const char** option) { + // at the end of the string, we're done + if (!cmdline || *cmdline == '\0') return NULL; + + // skip any leading whitespace + while (isspace(*cmdline)) cmdline++; + + // if we've hit the end of the string, we're done + if (*cmdline == '\0') return NULL; + + *option = cmdline; + + // find the end of this option or the string + while (!isspace(*cmdline) && *cmdline != '\0') cmdline++; + + // cmdline points to the whitespace or end of string + return cmdline; +} + +int cmdline_ints(const char* option, uint64_t args[], int max) { + // skip any leading text up to an '=' + const char* s = option; + while (1) { + const char c = *s++; + if (c == '=') break; + + if (c == '\0' || isspace(c)) { + s = option; + break; + } + } + + for (int i = 0; i < max; i++) { + char* end; + args[i] = parse_int(s, &end); + + // end of string or end of the option? + if (*end == '\0' || isspace(*end)) return i + 1; + + // not separator? signal an error if we have consumed any ints, + // otherwise return 0 saying that none were found + if (*end != ',') return i == 0 ? 0 : -1; + + // skip the , and get the next value + s = end + 1; + } + + // too many values! + return -1; +} + /** Acquire the memory information from the linuxboot table in memory. @@ -67,20 +142,50 @@ void AddMemoryRange(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN UINTN start, RETURN_STATUS EFIAPI ParseMemoryInfo(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN VOID* Params) { - UefiPayloadConfig* config; - int i; + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); + if (!config) { + DEBUG( + (DEBUG_ERROR, "ParseMemoryInfo: Could not find UEFI Payload config\n")); + return RETURN_SUCCESS; + } + + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { + const UefiPayloadConfigV1* config1 = &config->config.v1; + DEBUG( + (DEBUG_INFO, "MemoryMap #entries: %d\n", config1->NumMemoryMapEntries)); + + for (int i = 0; i < config1->NumMemoryMapEntries; i++) { + const MemoryMapEntry* entry = &config1->MemoryMapEntries[i]; + DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", entry->Start, + entry->End, entry->Type)); + AddMemoryRange(MemInfoCallback, entry->Start, entry->End, entry->Type); + } + } else - config = GetUefiPayLoadConfig(); + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { + const char* cmdline = config->config.v2.cmdline; + const char* option; + uint64_t args[3]; - DEBUG((DEBUG_INFO, "MemoryMap #entries: %d\n", config->NumMemoryMapEntries)); + // look for the mem=start,end,type + while ((cmdline = cmdline_next(cmdline, &option))) { + if (strncmp(option, "mem=", 4) != 0) continue; - MemoryMapEntry* entry = &config->MemoryMapEntries[0]; - for (i = 0; i < config->NumMemoryMapEntries; i++) { - DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", entry->Start, - entry->End, entry->Type)); - AddMemoryRange(MemInfoCallback, entry->Start, entry->End, entry->Type); - entry++; + if (cmdline_ints(option, args, 3) != 3) { + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); + continue; + } + + const uint64_t start = args[0]; + const uint64_t end = args[1]; + const uint64_t type = args[2]; + + DEBUG( + (DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", start, end, type)); + AddMemoryRange(MemInfoCallback, start, end, type); + } } + return RETURN_SUCCESS; } @@ -96,14 +201,52 @@ ParseMemoryInfo(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN VOID* Params) { RETURN_STATUS EFIAPI ParseSystemTable(OUT SYSTEM_TABLE_INFO* SystemTableInfo) { - UefiPayloadConfig* config; + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); + if (!config) { + DEBUG((DEBUG_ERROR, + "ParseSystemTable: Could not find UEFI Payload config\n")); + return RETURN_SUCCESS; + } - config = GetUefiPayLoadConfig(); - SystemTableInfo->AcpiTableBase = config->AcpiBase; - SystemTableInfo->AcpiTableSize = config->AcpiSize; + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { + const UefiPayloadConfigV1* config1 = &config->config.v1; + SystemTableInfo->AcpiTableBase = config1->AcpiBase; + SystemTableInfo->AcpiTableSize = config1->AcpiSize; - SystemTableInfo->SmbiosTableBase = config->SmbiosBase; - SystemTableInfo->SmbiosTableSize = config->SmbiosSize; + SystemTableInfo->SmbiosTableBase = config1->SmbiosBase; + SystemTableInfo->SmbiosTableSize = config1->SmbiosSize; + } else + + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { + const char* cmdline = config->config.v2.cmdline; + const char* option; + uint64_t args[2]; + + // look for the acpi config + while ((cmdline = cmdline_next(cmdline, &option))) { + if (strncmp(option, "ACPI20=", 7) == 0) { + const int count = cmdline_ints(option, args, 2); + if (count < 0) { + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); + continue; + } + + if (count > 0) SystemTableInfo->AcpiTableBase = args[0]; + if (count > 1) SystemTableInfo->AcpiTableSize = args[1]; + } + + if (strncmp(option, "SMBIOS=", 7) == 0) { + const int count = cmdline_ints(option, args, 2); + if (count < 0) { + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); + continue; + } + + if (count > 0) SystemTableInfo->SmbiosTableBase = args[0]; + if (count > 1) SystemTableInfo->SmbiosTableSize = args[1]; + } + } + } return RETURN_SUCCESS; } @@ -120,15 +263,52 @@ ParseSystemTable(OUT SYSTEM_TABLE_INFO* SystemTableInfo) { RETURN_STATUS EFIAPI ParseSerialInfo(OUT SERIAL_PORT_INFO* SerialPortInfo) { - UefiPayloadConfig* config; - config = GetUefiPayLoadConfig(); - - SerialPortInfo->BaseAddr = config->SerialConfig.BaseAddr; - SerialPortInfo->RegWidth = config->SerialConfig.RegWidth; - SerialPortInfo->Type = config->SerialConfig.Type; - SerialPortInfo->Baud = config->SerialConfig.Baud; - SerialPortInfo->InputHertz = config->SerialConfig.InputHertz; - SerialPortInfo->UartPciAddr = config->SerialConfig.UartPciAddr; + // fill in some reasonable defaults + SerialPortInfo->BaseAddr = 0x3f8; + SerialPortInfo->RegWidth = 1; + SerialPortInfo->Type = 1; // uefi.SerialPortTypeIO + SerialPortInfo->Baud = 115200; + SerialPortInfo->InputHertz = 1843200; + SerialPortInfo->UartPciAddr = 0; + + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); + if (!config) { + DEBUG((DEBUG_ERROR, "ParseSerialInfo: using default config\n")); + return RETURN_SUCCESS; + } + + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { + const UefiPayloadConfigV1* config1 = &config->config.v1; + SerialPortInfo->BaseAddr = config1->SerialConfig.BaseAddr; + SerialPortInfo->RegWidth = config1->SerialConfig.RegWidth; + SerialPortInfo->Type = config1->SerialConfig.Type; + SerialPortInfo->Baud = config1->SerialConfig.Baud; + SerialPortInfo->InputHertz = config1->SerialConfig.InputHertz; + SerialPortInfo->UartPciAddr = config1->SerialConfig.UartPciAddr; + } else + + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { + const char* cmdline = config->config.v2.cmdline; + const char* option; + uint64_t args[6] = {}; + + while ((cmdline = cmdline_next(cmdline, &option))) { + if (strncmp(option, "serial=", 7) != 0) continue; + + const int count = cmdline_ints(option, args, 6); + if (count < 0) { + DEBUG((DEBUG_ERROR, "Parse error: %a\n", option)); + continue; + } + + if (count > 0) SerialPortInfo->Baud = args[0]; + if (count > 1) SerialPortInfo->BaseAddr = args[1]; + if (count > 2) SerialPortInfo->RegWidth = args[2]; + if (count > 3) SerialPortInfo->Type = args[3]; + if (count > 4) SerialPortInfo->InputHertz = args[4]; + if (count > 5) SerialPortInfo->UartPciAddr = args[5]; + } + } return RETURN_SUCCESS; } -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 6/6] UefiPayloadPkg: LinuxBoot: use a text format for the configuration block. 2021-07-21 13:23 ` [PATCH v1 6/6] UefiPayloadPkg: LinuxBoot: use a text format for the configuration block Cheng-Chieh Huang @ 2021-07-21 17:09 ` Marvin Häuser 2021-07-22 13:48 ` Cheng-Chieh Huang 2021-08-04 3:00 ` Guo Dong 1 sibling, 1 reply; 33+ messages in thread From: Marvin Häuser @ 2021-07-21 17:09 UTC (permalink / raw) To: devel, chengchieh; +Cc: Trammell Hudson On 21.07.21 15:23, Cheng-Chieh Huang via groups.io wrote: > From: Trammell Hudson <hudson@trmm.net> > > This adds a text command line for the UefiPayloadPkg that uses > a textual magic number 'LnxBoot1' and a series of white-space > separated key=value[,value...] pairs for the parameters. > > The v1 binary configuration structure is used if it is present instead > for backwards compatability. > > Currently supported text command line arguments are are: > > * `serial=baud,base,width,type,hz,pci` > (only `baud` needs to be specified, the rest have reasonable > defaults) > > * `mem=start,end,type` > Types are based on `/sys/firmware/memmaps/*/types`: > 1 == "System RAM" > 3 == "ACPI Tables" > 4 == "ACPI Non-volatile Storage" > 5 == "Reserved" > > * `ACPI20=base` pointer to RDSP (from `/sys/firmware/efi/systab`) > > * `SMBIOS=base` pointer to the SMBIOS table (also from the EFI table) > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> > --- > UefiPayloadPkg/Include/Linuxboot.h | 17 +- > UefiPayloadPkg/Library/LbParseLib/LbParseLib.c | 252 +++++++++++++++++--- > 2 files changed, 230 insertions(+), 39 deletions(-) > > diff --git a/UefiPayloadPkg/Include/Linuxboot.h b/UefiPayloadPkg/Include/Linuxboot.h > index 34ca18069983..56b39b5a09ff 100644 > --- a/UefiPayloadPkg/Include/Linuxboot.h > +++ b/UefiPayloadPkg/Include/Linuxboot.h > @@ -24,8 +24,7 @@ typedef struct MemoryMapEntryStruct { > UINT32 Type; > } MemoryMapEntry; > > -typedef struct UefiPayloadConfigStruct { > - UINT64 Version; > +typedef struct { > UINT64 AcpiBase; > UINT64 AcpiSize; > UINT64 SmbiosBase; > @@ -33,10 +32,22 @@ typedef struct UefiPayloadConfigStruct { > SerialPortConfig SerialConfig; > UINT32 NumMemoryMapEntries; > MemoryMapEntry MemoryMapEntries[0]; > +} UefiPayloadConfigV1; > + > +typedef struct UefiPayloadConfigStruct { > + UINT64 Version; > + union { > + UefiPayloadConfigV1 v1; > + struct { > + char cmdline[0]; // up to 64 KB > + } v2; > + } config; > } UefiPayloadConfig; > #pragma pack() > > -#define UEFI_PAYLOAD_CONFIG_VERSION 1 > +// magic version config is "LnxBoot1" > +#define UEFI_PAYLOAD_CONFIG_VERSION1 1 > +#define UEFI_PAYLOAD_CONFIG_VERSION2 0x31746f6f42786e4cULL > > #define LINUXBOOT_MEM_RAM 1 > #define LINUXBOOT_MEM_DEFAULT 2 > diff --git a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > index 34bfb6a1073f..5e68091cac91 100644 > --- a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > +++ b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > @@ -1,13 +1,12 @@ > /** @file > - This library will parse the linuxboot table in memory and extract those required > - information. > + This library will parse the linuxboot table in memory and extract those > +required information. > > Copyright (c) 2021, the u-root Authors. All rights reserved.<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > > - > #include <IndustryStandard/Acpi.h> > #include <IndustryStandard/SmBios.h> > #include <Library/BaseLib.h> > @@ -18,17 +17,42 @@ > #include <Library/PcdLib.h> > #include <Linuxboot.h> > #include <Uefi/UefiBaseType.h> > +#include <stdint.h> > +#include <stdlib.h> > +//#include <string.h> > +//#include <ctype.h> > + > +#define strncmp(a, b, n) AsciiStrnCmp((a), (b), (n)) > + > +static uint64_t parse_int(const char* s, char** end) { > + UINT64 x; > + > + if (s[0] == '0' && s[1] == 'x') > + AsciiStrHexToUint64S(s, end, &x); > + else > + AsciiStrDecimalToUint64S(s, end, &x); > + > + return x; > +} > + > +static int isspace(const char c) { return c == ' ' || c == '\t' || c == '\n'; } > > // Retrieve UefiPayloadConfig from Linuxboot's uefiboot > -UefiPayloadConfig* GetUefiPayLoadConfig() { > - UefiPayloadConfig* config = > +const UefiPayloadConfig* GetUefiPayLoadConfig() { > + const UefiPayloadConfig* config = > (UefiPayloadConfig*)(UINTN)(PcdGet32(PcdPayloadFdMemBase) - SIZE_64KB); > - if (config->Version != UEFI_PAYLOAD_CONFIG_VERSION) { > - DEBUG((DEBUG_ERROR, "Expect payload config version: %d, but get %d\n", > - UEFI_PAYLOAD_CONFIG_VERSION, config->Version)); > - CpuDeadLoop (); > - } > - return config; > + > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1 || > + config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) > + return config; > + > + DEBUG((DEBUG_ERROR, > + "Expect payload config version %016lx or %016lx, but get %016lx\n", > + UEFI_PAYLOAD_CONFIG_VERSION1, UEFI_PAYLOAD_CONFIG_VERSION2, > + config->Version)); > + CpuDeadLoop(); > + while (1) > + ; > } > > // Align the address and add memory rang to MemInfoCallback > @@ -54,6 +78,57 @@ void AddMemoryRange(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN UINTN start, > MemInfoCallback(&MemoryMap, NULL); > } > > +const char* cmdline_next(const char* cmdline, const char** option) { > + // at the end of the string, we're done > + if (!cmdline || *cmdline == '\0') return NULL; > + > + // skip any leading whitespace > + while (isspace(*cmdline)) cmdline++; > + > + // if we've hit the end of the string, we're done > + if (*cmdline == '\0') return NULL; > + > + *option = cmdline; > + > + // find the end of this option or the string > + while (!isspace(*cmdline) && *cmdline != '\0') cmdline++; > + > + // cmdline points to the whitespace or end of string > + return cmdline; > +} > + > +int cmdline_ints(const char* option, uint64_t args[], int max) { > + // skip any leading text up to an '=' > + const char* s = option; > + while (1) { > + const char c = *s++; > + if (c == '=') break; > + > + if (c == '\0' || isspace(c)) { > + s = option; > + break; > + } > + } > + > + for (int i = 0; i < max; i++) { > + char* end; > + args[i] = parse_int(s, &end); > + > + // end of string or end of the option? > + if (*end == '\0' || isspace(*end)) return i + 1; > + > + // not separator? signal an error if we have consumed any ints, > + // otherwise return 0 saying that none were found > + if (*end != ',') return i == 0 ? 0 : -1; > + > + // skip the , and get the next value > + s = end + 1; > + } > + > + // too many values! > + return -1; > +} > + > /** > Acquire the memory information from the linuxboot table in memory. > > @@ -67,20 +142,50 @@ void AddMemoryRange(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN UINTN start, > RETURN_STATUS > EFIAPI > ParseMemoryInfo(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN VOID* Params) { > - UefiPayloadConfig* config; > - int i; > + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); > + if (!config) { > + DEBUG( > + (DEBUG_ERROR, "ParseMemoryInfo: Could not find UEFI Payload config\n")); > + return RETURN_SUCCESS; > + } > + > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { > + const UefiPayloadConfigV1* config1 = &config->config.v1; > + DEBUG( > + (DEBUG_INFO, "MemoryMap #entries: %d\n", config1->NumMemoryMapEntries)); > + > + for (int i = 0; i < config1->NumMemoryMapEntries; i++) { > + const MemoryMapEntry* entry = &config1->MemoryMapEntries[i]; > + DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", entry->Start, > + entry->End, entry->Type)); > + AddMemoryRange(MemInfoCallback, entry->Start, entry->End, entry->Type); > + } > + } else > > - config = GetUefiPayLoadConfig(); > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { > + const char* cmdline = config->config.v2.cmdline; > + const char* option; > + uint64_t args[3]; > > - DEBUG((DEBUG_INFO, "MemoryMap #entries: %d\n", config->NumMemoryMapEntries)); > + // look for the mem=start,end,type > + while ((cmdline = cmdline_next(cmdline, &option))) { > + if (strncmp(option, "mem=", 4) != 0) continue; > > - MemoryMapEntry* entry = &config->MemoryMapEntries[0]; > - for (i = 0; i < config->NumMemoryMapEntries; i++) { > - DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", entry->Start, > - entry->End, entry->Type)); > - AddMemoryRange(MemInfoCallback, entry->Start, entry->End, entry->Type); > - entry++; > + if (cmdline_ints(option, args, 3) != 3) { > + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); > + continue; > + } > + > + const uint64_t start = args[0]; > + const uint64_t end = args[1]; > + const uint64_t type = args[2]; > + > + DEBUG( > + (DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", start, end, type)); > + AddMemoryRange(MemInfoCallback, start, end, type); > + } > } > + > return RETURN_SUCCESS; > } > > @@ -96,14 +201,52 @@ ParseMemoryInfo(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN VOID* Params) { > RETURN_STATUS > EFIAPI > ParseSystemTable(OUT SYSTEM_TABLE_INFO* SystemTableInfo) { > - UefiPayloadConfig* config; > + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); > + if (!config) { > + DEBUG((DEBUG_ERROR, > + "ParseSystemTable: Could not find UEFI Payload config\n")); > + return RETURN_SUCCESS; > + } > > - config = GetUefiPayLoadConfig(); > - SystemTableInfo->AcpiTableBase = config->AcpiBase; > - SystemTableInfo->AcpiTableSize = config->AcpiSize; > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { > + const UefiPayloadConfigV1* config1 = &config->config.v1; > + SystemTableInfo->AcpiTableBase = config1->AcpiBase; > + SystemTableInfo->AcpiTableSize = config1->AcpiSize; > > - SystemTableInfo->SmbiosTableBase = config->SmbiosBase; > - SystemTableInfo->SmbiosTableSize = config->SmbiosSize; > + SystemTableInfo->SmbiosTableBase = config1->SmbiosBase; > + SystemTableInfo->SmbiosTableSize = config1->SmbiosSize; > + } else > + > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { > + const char* cmdline = config->config.v2.cmdline; > + const char* option; > + uint64_t args[2]; > + > + // look for the acpi config > + while ((cmdline = cmdline_next(cmdline, &option))) { > + if (strncmp(option, "ACPI20=", 7) == 0) { > + const int count = cmdline_ints(option, args, 2); > + if (count < 0) { > + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); > + continue; > + } > + > + if (count > 0) SystemTableInfo->AcpiTableBase = args[0]; > + if (count > 1) SystemTableInfo->AcpiTableSize = args[1]; > + } > + > + if (strncmp(option, "SMBIOS=", 7) == 0) { > + const int count = cmdline_ints(option, args, 2); > + if (count < 0) { > + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); > + continue; > + } > + > + if (count > 0) SystemTableInfo->SmbiosTableBase = args[0]; > + if (count > 1) SystemTableInfo->SmbiosTableSize = args[1]; > + } Sorry, from only a quick peak, can this not leave {Acpi,Smbios}TableBase and {Acpi,Smbios}TableSize undefined entirely, while returning RETURN_SUCCESS? Even if not, it looks kind of odd a command-line argument can change the base address without changing the size, is there a documentation of this behaviour? What is the structure supposed to carry if no such arguments are given at all? Thanks for your time! Best regards, Marvin > + } > + } > > return RETURN_SUCCESS; > } > @@ -120,15 +263,52 @@ ParseSystemTable(OUT SYSTEM_TABLE_INFO* SystemTableInfo) { > RETURN_STATUS > EFIAPI > ParseSerialInfo(OUT SERIAL_PORT_INFO* SerialPortInfo) { > - UefiPayloadConfig* config; > - config = GetUefiPayLoadConfig(); > - > - SerialPortInfo->BaseAddr = config->SerialConfig.BaseAddr; > - SerialPortInfo->RegWidth = config->SerialConfig.RegWidth; > - SerialPortInfo->Type = config->SerialConfig.Type; > - SerialPortInfo->Baud = config->SerialConfig.Baud; > - SerialPortInfo->InputHertz = config->SerialConfig.InputHertz; > - SerialPortInfo->UartPciAddr = config->SerialConfig.UartPciAddr; > + // fill in some reasonable defaults > + SerialPortInfo->BaseAddr = 0x3f8; > + SerialPortInfo->RegWidth = 1; > + SerialPortInfo->Type = 1; // uefi.SerialPortTypeIO > + SerialPortInfo->Baud = 115200; > + SerialPortInfo->InputHertz = 1843200; > + SerialPortInfo->UartPciAddr = 0; > + > + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); > + if (!config) { > + DEBUG((DEBUG_ERROR, "ParseSerialInfo: using default config\n")); > + return RETURN_SUCCESS; > + } > + > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { > + const UefiPayloadConfigV1* config1 = &config->config.v1; > + SerialPortInfo->BaseAddr = config1->SerialConfig.BaseAddr; > + SerialPortInfo->RegWidth = config1->SerialConfig.RegWidth; > + SerialPortInfo->Type = config1->SerialConfig.Type; > + SerialPortInfo->Baud = config1->SerialConfig.Baud; > + SerialPortInfo->InputHertz = config1->SerialConfig.InputHertz; > + SerialPortInfo->UartPciAddr = config1->SerialConfig.UartPciAddr; > + } else > + > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { > + const char* cmdline = config->config.v2.cmdline; > + const char* option; > + uint64_t args[6] = {}; > + > + while ((cmdline = cmdline_next(cmdline, &option))) { > + if (strncmp(option, "serial=", 7) != 0) continue; > + > + const int count = cmdline_ints(option, args, 6); > + if (count < 0) { > + DEBUG((DEBUG_ERROR, "Parse error: %a\n", option)); > + continue; > + } > + > + if (count > 0) SerialPortInfo->Baud = args[0]; > + if (count > 1) SerialPortInfo->BaseAddr = args[1]; > + if (count > 2) SerialPortInfo->RegWidth = args[2]; > + if (count > 3) SerialPortInfo->Type = args[3]; > + if (count > 4) SerialPortInfo->InputHertz = args[4]; > + if (count > 5) SerialPortInfo->UartPciAddr = args[5]; > + } > + } > > return RETURN_SUCCESS; > } ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 6/6] UefiPayloadPkg: LinuxBoot: use a text format for the configuration block. 2021-07-21 17:09 ` [edk2-devel] " Marvin Häuser @ 2021-07-22 13:48 ` Cheng-Chieh Huang 0 siblings, 0 replies; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-22 13:48 UTC (permalink / raw) To: Marvin Häuser; +Cc: devel, Trammell Hudson [-- Attachment #1: Type: text/plain, Size: 15334 bytes --] Here is the documentation: https://github.com/osresearch/kexec-load/blob/main/README.md On Thu, Jul 22, 2021 at 1:09 AM Marvin Häuser <mhaeuser@posteo.de> wrote: > > > On 21.07.21 15:23, Cheng-Chieh Huang via groups.io wrote: > > From: Trammell Hudson <hudson@trmm.net> > > > > This adds a text command line for the UefiPayloadPkg that uses > > a textual magic number 'LnxBoot1' and a series of white-space > > separated key=value[,value...] pairs for the parameters. > > > > The v1 binary configuration structure is used if it is present instead > > for backwards compatability. > > > > Currently supported text command line arguments are are: > > > > * `serial=baud,base,width,type,hz,pci` > > (only `baud` needs to be specified, the rest have reasonable > > defaults) > > > > * `mem=start,end,type` > > Types are based on `/sys/firmware/memmaps/*/types`: > > 1 == "System RAM" > > 3 == "ACPI Tables" > > 4 == "ACPI Non-volatile Storage" > > 5 == "Reserved" > > > > * `ACPI20=base` pointer to RDSP (from `/sys/firmware/efi/systab`) > > > > * `SMBIOS=base` pointer to the SMBIOS table (also from the EFI table) > > > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> > > --- > > UefiPayloadPkg/Include/Linuxboot.h | 17 +- > > UefiPayloadPkg/Library/LbParseLib/LbParseLib.c | 252 > +++++++++++++++++--- > > 2 files changed, 230 insertions(+), 39 deletions(-) > > > > diff --git a/UefiPayloadPkg/Include/Linuxboot.h > b/UefiPayloadPkg/Include/Linuxboot.h > > index 34ca18069983..56b39b5a09ff 100644 > > --- a/UefiPayloadPkg/Include/Linuxboot.h > > +++ b/UefiPayloadPkg/Include/Linuxboot.h > > @@ -24,8 +24,7 @@ typedef struct MemoryMapEntryStruct { > > UINT32 Type; > > } MemoryMapEntry; > > > > -typedef struct UefiPayloadConfigStruct { > > - UINT64 Version; > > +typedef struct { > > UINT64 AcpiBase; > > UINT64 AcpiSize; > > UINT64 SmbiosBase; > > @@ -33,10 +32,22 @@ typedef struct UefiPayloadConfigStruct { > > SerialPortConfig SerialConfig; > > UINT32 NumMemoryMapEntries; > > MemoryMapEntry MemoryMapEntries[0]; > > +} UefiPayloadConfigV1; > > + > > +typedef struct UefiPayloadConfigStruct { > > + UINT64 Version; > > + union { > > + UefiPayloadConfigV1 v1; > > + struct { > > + char cmdline[0]; // up to 64 KB > > + } v2; > > + } config; > > } UefiPayloadConfig; > > #pragma pack() > > > > -#define UEFI_PAYLOAD_CONFIG_VERSION 1 > > +// magic version config is "LnxBoot1" > > +#define UEFI_PAYLOAD_CONFIG_VERSION1 1 > > +#define UEFI_PAYLOAD_CONFIG_VERSION2 0x31746f6f42786e4cULL > > > > #define LINUXBOOT_MEM_RAM 1 > > #define LINUXBOOT_MEM_DEFAULT 2 > > diff --git a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > > index 34bfb6a1073f..5e68091cac91 100644 > > --- a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > > +++ b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > > @@ -1,13 +1,12 @@ > > /** @file > > - This library will parse the linuxboot table in memory and extract > those required > > - information. > > + This library will parse the linuxboot table in memory and extract > those > > +required information. > > > > Copyright (c) 2021, the u-root Authors. All rights reserved.<BR> > > SPDX-License-Identifier: BSD-2-Clause-Patent > > > > **/ > > > > - > > #include <IndustryStandard/Acpi.h> > > #include <IndustryStandard/SmBios.h> > > #include <Library/BaseLib.h> > > @@ -18,17 +17,42 @@ > > #include <Library/PcdLib.h> > > #include <Linuxboot.h> > > #include <Uefi/UefiBaseType.h> > > +#include <stdint.h> > > +#include <stdlib.h> > > +//#include <string.h> > > +//#include <ctype.h> > > + > > +#define strncmp(a, b, n) AsciiStrnCmp((a), (b), (n)) > > + > > +static uint64_t parse_int(const char* s, char** end) { > > + UINT64 x; > > + > > + if (s[0] == '0' && s[1] == 'x') > > + AsciiStrHexToUint64S(s, end, &x); > > + else > > + AsciiStrDecimalToUint64S(s, end, &x); > > + > > + return x; > > +} > > + > > +static int isspace(const char c) { return c == ' ' || c == '\t' || c == > '\n'; } > > > > // Retrieve UefiPayloadConfig from Linuxboot's uefiboot > > -UefiPayloadConfig* GetUefiPayLoadConfig() { > > - UefiPayloadConfig* config = > > +const UefiPayloadConfig* GetUefiPayLoadConfig() { > > + const UefiPayloadConfig* config = > > (UefiPayloadConfig*)(UINTN)(PcdGet32(PcdPayloadFdMemBase) - > SIZE_64KB); > > - if (config->Version != UEFI_PAYLOAD_CONFIG_VERSION) { > > - DEBUG((DEBUG_ERROR, "Expect payload config version: %d, but get > %d\n", > > - UEFI_PAYLOAD_CONFIG_VERSION, config->Version)); > > - CpuDeadLoop (); > > - } > > - return config; > > + > > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1 || > > + config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) > > + return config; > > + > > + DEBUG((DEBUG_ERROR, > > + "Expect payload config version %016lx or %016lx, but get > %016lx\n", > > + UEFI_PAYLOAD_CONFIG_VERSION1, UEFI_PAYLOAD_CONFIG_VERSION2, > > + config->Version)); > > + CpuDeadLoop(); > > + while (1) > > + ; > > } > > > > // Align the address and add memory rang to MemInfoCallback > > @@ -54,6 +78,57 @@ void AddMemoryRange(IN BL_MEM_INFO_CALLBACK > MemInfoCallback, IN UINTN start, > > MemInfoCallback(&MemoryMap, NULL); > > } > > > > +const char* cmdline_next(const char* cmdline, const char** option) { > > + // at the end of the string, we're done > > + if (!cmdline || *cmdline == '\0') return NULL; > > + > > + // skip any leading whitespace > > + while (isspace(*cmdline)) cmdline++; > > + > > + // if we've hit the end of the string, we're done > > + if (*cmdline == '\0') return NULL; > > + > > + *option = cmdline; > > + > > + // find the end of this option or the string > > + while (!isspace(*cmdline) && *cmdline != '\0') cmdline++; > > + > > + // cmdline points to the whitespace or end of string > > + return cmdline; > > +} > > + > > +int cmdline_ints(const char* option, uint64_t args[], int max) { > > + // skip any leading text up to an '=' > > + const char* s = option; > > + while (1) { > > + const char c = *s++; > > + if (c == '=') break; > > + > > + if (c == '\0' || isspace(c)) { > > + s = option; > > + break; > > + } > > + } > > + > > + for (int i = 0; i < max; i++) { > > + char* end; > > + args[i] = parse_int(s, &end); > > + > > + // end of string or end of the option? > > + if (*end == '\0' || isspace(*end)) return i + 1; > > + > > + // not separator? signal an error if we have consumed any ints, > > + // otherwise return 0 saying that none were found > > + if (*end != ',') return i == 0 ? 0 : -1; > > + > > + // skip the , and get the next value > > + s = end + 1; > > + } > > + > > + // too many values! > > + return -1; > > +} > > + > > /** > > Acquire the memory information from the linuxboot table in memory. > > > > @@ -67,20 +142,50 @@ void AddMemoryRange(IN BL_MEM_INFO_CALLBACK > MemInfoCallback, IN UINTN start, > > RETURN_STATUS > > EFIAPI > > ParseMemoryInfo(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN VOID* > Params) { > > - UefiPayloadConfig* config; > > - int i; > > + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); > > + if (!config) { > > + DEBUG( > > + (DEBUG_ERROR, "ParseMemoryInfo: Could not find UEFI Payload > config\n")); > > + return RETURN_SUCCESS; > > + } > > + > > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { > > + const UefiPayloadConfigV1* config1 = &config->config.v1; > > + DEBUG( > > + (DEBUG_INFO, "MemoryMap #entries: %d\n", > config1->NumMemoryMapEntries)); > > + > > + for (int i = 0; i < config1->NumMemoryMapEntries; i++) { > > + const MemoryMapEntry* entry = &config1->MemoryMapEntries[i]; > > + DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", > entry->Start, > > + entry->End, entry->Type)); > > + AddMemoryRange(MemInfoCallback, entry->Start, entry->End, > entry->Type); > > + } > > + } else > > > > - config = GetUefiPayLoadConfig(); > > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { > > + const char* cmdline = config->config.v2.cmdline; > > + const char* option; > > + uint64_t args[3]; > > > > - DEBUG((DEBUG_INFO, "MemoryMap #entries: %d\n", > config->NumMemoryMapEntries)); > > + // look for the mem=start,end,type > > + while ((cmdline = cmdline_next(cmdline, &option))) { > > + if (strncmp(option, "mem=", 4) != 0) continue; > > > > - MemoryMapEntry* entry = &config->MemoryMapEntries[0]; > > - for (i = 0; i < config->NumMemoryMapEntries; i++) { > > - DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", > entry->Start, > > - entry->End, entry->Type)); > > - AddMemoryRange(MemInfoCallback, entry->Start, entry->End, > entry->Type); > > - entry++; > > + if (cmdline_ints(option, args, 3) != 3) { > > + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); > > + continue; > > + } > > + > > + const uint64_t start = args[0]; > > + const uint64_t end = args[1]; > > + const uint64_t type = args[2]; > > + > > + DEBUG( > > + (DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", start, end, > type)); > > + AddMemoryRange(MemInfoCallback, start, end, type); > > + } > > } > > + > > return RETURN_SUCCESS; > > } > > > > @@ -96,14 +201,52 @@ ParseMemoryInfo(IN BL_MEM_INFO_CALLBACK > MemInfoCallback, IN VOID* Params) { > > RETURN_STATUS > > EFIAPI > > ParseSystemTable(OUT SYSTEM_TABLE_INFO* SystemTableInfo) { > > - UefiPayloadConfig* config; > > + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); > > + if (!config) { > > + DEBUG((DEBUG_ERROR, > > + "ParseSystemTable: Could not find UEFI Payload config\n")); > > + return RETURN_SUCCESS; > > + } > > > > - config = GetUefiPayLoadConfig(); > > - SystemTableInfo->AcpiTableBase = config->AcpiBase; > > - SystemTableInfo->AcpiTableSize = config->AcpiSize; > > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { > > + const UefiPayloadConfigV1* config1 = &config->config.v1; > > + SystemTableInfo->AcpiTableBase = config1->AcpiBase; > > + SystemTableInfo->AcpiTableSize = config1->AcpiSize; > > > > - SystemTableInfo->SmbiosTableBase = config->SmbiosBase; > > - SystemTableInfo->SmbiosTableSize = config->SmbiosSize; > > + SystemTableInfo->SmbiosTableBase = config1->SmbiosBase; > > + SystemTableInfo->SmbiosTableSize = config1->SmbiosSize; > > + } else > > + > > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { > > + const char* cmdline = config->config.v2.cmdline; > > + const char* option; > > + uint64_t args[2]; > > + > > + // look for the acpi config > > + while ((cmdline = cmdline_next(cmdline, &option))) { > > + if (strncmp(option, "ACPI20=", 7) == 0) { > > + const int count = cmdline_ints(option, args, 2); > > + if (count < 0) { > > + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); > > + continue; > > + } > > + > > + if (count > 0) SystemTableInfo->AcpiTableBase = args[0]; > > + if (count > 1) SystemTableInfo->AcpiTableSize = args[1]; > > + } > > + > > + if (strncmp(option, "SMBIOS=", 7) == 0) { > > + const int count = cmdline_ints(option, args, 2); > > + if (count < 0) { > > + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); > > + continue; > > + } > > + > > + if (count > 0) SystemTableInfo->SmbiosTableBase = args[0]; > > + if (count > 1) SystemTableInfo->SmbiosTableSize = args[1]; > > + } > > Sorry, from only a quick peak, can this not leave {Acpi,Smbios}TableBase > and {Acpi,Smbios}TableSize undefined entirely, while returning > RETURN_SUCCESS? > Even if not, it looks kind of odd a command-line argument can change the > base address without changing the size, is there a documentation of this > behaviour? > What is the structure supposed to carry if no such arguments are given > at all? > > Thanks for your time! > > Best regards, > Marvin > > > + } > > + } > > > > return RETURN_SUCCESS; > > } > > @@ -120,15 +263,52 @@ ParseSystemTable(OUT SYSTEM_TABLE_INFO* > SystemTableInfo) { > > RETURN_STATUS > > EFIAPI > > ParseSerialInfo(OUT SERIAL_PORT_INFO* SerialPortInfo) { > > - UefiPayloadConfig* config; > > - config = GetUefiPayLoadConfig(); > > - > > - SerialPortInfo->BaseAddr = config->SerialConfig.BaseAddr; > > - SerialPortInfo->RegWidth = config->SerialConfig.RegWidth; > > - SerialPortInfo->Type = config->SerialConfig.Type; > > - SerialPortInfo->Baud = config->SerialConfig.Baud; > > - SerialPortInfo->InputHertz = config->SerialConfig.InputHertz; > > - SerialPortInfo->UartPciAddr = config->SerialConfig.UartPciAddr; > > + // fill in some reasonable defaults > > + SerialPortInfo->BaseAddr = 0x3f8; > > + SerialPortInfo->RegWidth = 1; > > + SerialPortInfo->Type = 1; // uefi.SerialPortTypeIO > > + SerialPortInfo->Baud = 115200; > > + SerialPortInfo->InputHertz = 1843200; > > + SerialPortInfo->UartPciAddr = 0; > > + > > + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); > > + if (!config) { > > + DEBUG((DEBUG_ERROR, "ParseSerialInfo: using default config\n")); > > + return RETURN_SUCCESS; > > + } > > + > > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { > > + const UefiPayloadConfigV1* config1 = &config->config.v1; > > + SerialPortInfo->BaseAddr = config1->SerialConfig.BaseAddr; > > + SerialPortInfo->RegWidth = config1->SerialConfig.RegWidth; > > + SerialPortInfo->Type = config1->SerialConfig.Type; > > + SerialPortInfo->Baud = config1->SerialConfig.Baud; > > + SerialPortInfo->InputHertz = config1->SerialConfig.InputHertz; > > + SerialPortInfo->UartPciAddr = config1->SerialConfig.UartPciAddr; > > + } else > > + > > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { > > + const char* cmdline = config->config.v2.cmdline; > > + const char* option; > > + uint64_t args[6] = {}; > > + > > + while ((cmdline = cmdline_next(cmdline, &option))) { > > + if (strncmp(option, "serial=", 7) != 0) continue; > > + > > + const int count = cmdline_ints(option, args, 6); > > + if (count < 0) { > > + DEBUG((DEBUG_ERROR, "Parse error: %a\n", option)); > > + continue; > > + } > > + > > + if (count > 0) SerialPortInfo->Baud = args[0]; > > + if (count > 1) SerialPortInfo->BaseAddr = args[1]; > > + if (count > 2) SerialPortInfo->RegWidth = args[2]; > > + if (count > 3) SerialPortInfo->Type = args[3]; > > + if (count > 4) SerialPortInfo->InputHertz = args[4]; > > + if (count > 5) SerialPortInfo->UartPciAddr = args[5]; > > + } > > + } > > > > return RETURN_SUCCESS; > > } > > [-- Attachment #2: Type: text/html, Size: 19253 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 6/6] UefiPayloadPkg: LinuxBoot: use a text format for the configuration block. 2021-07-21 13:23 ` [PATCH v1 6/6] UefiPayloadPkg: LinuxBoot: use a text format for the configuration block Cheng-Chieh Huang 2021-07-21 17:09 ` [edk2-devel] " Marvin Häuser @ 2021-08-04 3:00 ` Guo Dong 2021-08-07 13:53 ` Cheng-Chieh Huang 1 sibling, 1 reply; 33+ messages in thread From: Guo Dong @ 2021-08-04 3:00 UTC (permalink / raw) To: devel@edk2.groups.io, chengchieh@google.com; +Cc: Trammell Hudson Please run BaseTools\Scripts\PatchCheck.py to make sure it passed the check. Update LbParseLib.c following https://edk2-docs.gitbook.io/edk-ii-c-coding-standards-specification/. current code is more like Linux style. E.g. +static uint64_t parse_int(const char* s, char** end) { + UINT64 x; Removed unused comments +//#include <string.h> +//#include <ctype.h> Thanks, Guo -----Original Message----- From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Cheng-Chieh Huang via groups.io Sent: Wednesday, July 21, 2021 6:23 AM To: devel@edk2.groups.io Cc: Trammell Hudson <hudson@trmm.net>; Cheng-Chieh Huang <chengchieh@google.com> Subject: [edk2-devel] [PATCH v1 6/6] UefiPayloadPkg: LinuxBoot: use a text format for the configuration block. From: Trammell Hudson <hudson@trmm.net> This adds a text command line for the UefiPayloadPkg that uses a textual magic number 'LnxBoot1' and a series of white-space separated key=value[,value...] pairs for the parameters. The v1 binary configuration structure is used if it is present instead for backwards compatability. Currently supported text command line arguments are are: * `serial=baud,base,width,type,hz,pci` (only `baud` needs to be specified, the rest have reasonable defaults) * `mem=start,end,type` Types are based on `/sys/firmware/memmaps/*/types`: 1 == "System RAM" 3 == "ACPI Tables" 4 == "ACPI Non-volatile Storage" 5 == "Reserved" * `ACPI20=base` pointer to RDSP (from `/sys/firmware/efi/systab`) * `SMBIOS=base` pointer to the SMBIOS table (also from the EFI table) Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> --- UefiPayloadPkg/Include/Linuxboot.h | 17 +- UefiPayloadPkg/Library/LbParseLib/LbParseLib.c | 252 +++++++++++++++++--- 2 files changed, 230 insertions(+), 39 deletions(-) diff --git a/UefiPayloadPkg/Include/Linuxboot.h b/UefiPayloadPkg/Include/Linuxboot.h index 34ca18069983..56b39b5a09ff 100644 --- a/UefiPayloadPkg/Include/Linuxboot.h +++ b/UefiPayloadPkg/Include/Linuxboot.h @@ -24,8 +24,7 @@ typedef struct MemoryMapEntryStruct { UINT32 Type; } MemoryMapEntry; -typedef struct UefiPayloadConfigStruct { - UINT64 Version; +typedef struct { UINT64 AcpiBase; UINT64 AcpiSize; UINT64 SmbiosBase; @@ -33,10 +32,22 @@ typedef struct UefiPayloadConfigStruct { SerialPortConfig SerialConfig; UINT32 NumMemoryMapEntries; MemoryMapEntry MemoryMapEntries[0]; +} UefiPayloadConfigV1; + +typedef struct UefiPayloadConfigStruct { + UINT64 Version; + union { + UefiPayloadConfigV1 v1; + struct { + char cmdline[0]; // up to 64 KB + } v2; + } config; } UefiPayloadConfig; #pragma pack() -#define UEFI_PAYLOAD_CONFIG_VERSION 1 +// magic version config is "LnxBoot1" +#define UEFI_PAYLOAD_CONFIG_VERSION1 1 +#define UEFI_PAYLOAD_CONFIG_VERSION2 0x31746f6f42786e4cULL #define LINUXBOOT_MEM_RAM 1 #define LINUXBOOT_MEM_DEFAULT 2 diff --git a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c index 34bfb6a1073f..5e68091cac91 100644 --- a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c +++ b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c @@ -1,13 +1,12 @@ /** @file - This library will parse the linuxboot table in memory and extract those required - information. + This library will parse the linuxboot table in memory and extract +those required information. Copyright (c) 2021, the u-root Authors. All rights reserved.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent **/ - #include <IndustryStandard/Acpi.h> #include <IndustryStandard/SmBios.h> #include <Library/BaseLib.h> @@ -18,17 +17,42 @@ #include <Library/PcdLib.h> #include <Linuxboot.h> #include <Uefi/UefiBaseType.h> +#include <stdint.h> +#include <stdlib.h> +//#include <string.h> +//#include <ctype.h> + +#define strncmp(a, b, n) AsciiStrnCmp((a), (b), (n)) + +static uint64_t parse_int(const char* s, char** end) { + UINT64 x; + + if (s[0] == '0' && s[1] == 'x') + AsciiStrHexToUint64S(s, end, &x); + else + AsciiStrDecimalToUint64S(s, end, &x); + + return x; +} + +static int isspace(const char c) { return c == ' ' || c == '\t' || c == +'\n'; } // Retrieve UefiPayloadConfig from Linuxboot's uefiboot -UefiPayloadConfig* GetUefiPayLoadConfig() { - UefiPayloadConfig* config = +const UefiPayloadConfig* GetUefiPayLoadConfig() { + const UefiPayloadConfig* config = (UefiPayloadConfig*)(UINTN)(PcdGet32(PcdPayloadFdMemBase) - SIZE_64KB); - if (config->Version != UEFI_PAYLOAD_CONFIG_VERSION) { - DEBUG((DEBUG_ERROR, "Expect payload config version: %d, but get %d\n", - UEFI_PAYLOAD_CONFIG_VERSION, config->Version)); - CpuDeadLoop (); - } - return config; + + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1 || + config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) + return config; + + DEBUG((DEBUG_ERROR, + "Expect payload config version %016lx or %016lx, but get %016lx\n", + UEFI_PAYLOAD_CONFIG_VERSION1, UEFI_PAYLOAD_CONFIG_VERSION2, + config->Version)); + CpuDeadLoop(); + while (1) + ; } // Align the address and add memory rang to MemInfoCallback @@ -54,6 +78,57 @@ void AddMemoryRange(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN UINTN start, MemInfoCallback(&MemoryMap, NULL); } +const char* cmdline_next(const char* cmdline, const char** option) { + // at the end of the string, we're done + if (!cmdline || *cmdline == '\0') return NULL; + + // skip any leading whitespace + while (isspace(*cmdline)) cmdline++; + + // if we've hit the end of the string, we're done if (*cmdline == + '\0') return NULL; + + *option = cmdline; + + // find the end of this option or the string while + (!isspace(*cmdline) && *cmdline != '\0') cmdline++; + + // cmdline points to the whitespace or end of string + return cmdline; +} + +int cmdline_ints(const char* option, uint64_t args[], int max) { + // skip any leading text up to an '=' + const char* s = option; + while (1) { + const char c = *s++; + if (c == '=') break; + + if (c == '\0' || isspace(c)) { + s = option; + break; + } + } + + for (int i = 0; i < max; i++) { + char* end; + args[i] = parse_int(s, &end); + + // end of string or end of the option? + if (*end == '\0' || isspace(*end)) return i + 1; + + // not separator? signal an error if we have consumed any ints, + // otherwise return 0 saying that none were found + if (*end != ',') return i == 0 ? 0 : -1; + + // skip the , and get the next value + s = end + 1; + } + + // too many values! + return -1; +} + /** Acquire the memory information from the linuxboot table in memory. @@ -67,20 +142,50 @@ void AddMemoryRange(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN UINTN start, RETURN_STATUS EFIAPI ParseMemoryInfo(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN VOID* Params) { - UefiPayloadConfig* config; - int i; + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); if + (!config) { + DEBUG( + (DEBUG_ERROR, "ParseMemoryInfo: Could not find UEFI Payload config\n")); + return RETURN_SUCCESS; + } + + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { + const UefiPayloadConfigV1* config1 = &config->config.v1; + DEBUG( + (DEBUG_INFO, "MemoryMap #entries: %d\n", + config1->NumMemoryMapEntries)); + + for (int i = 0; i < config1->NumMemoryMapEntries; i++) { + const MemoryMapEntry* entry = &config1->MemoryMapEntries[i]; + DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", entry->Start, + entry->End, entry->Type)); + AddMemoryRange(MemInfoCallback, entry->Start, entry->End, entry->Type); + } + } else - config = GetUefiPayLoadConfig(); + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { + const char* cmdline = config->config.v2.cmdline; + const char* option; + uint64_t args[3]; - DEBUG((DEBUG_INFO, "MemoryMap #entries: %d\n", config->NumMemoryMapEntries)); + // look for the mem=start,end,type + while ((cmdline = cmdline_next(cmdline, &option))) { + if (strncmp(option, "mem=", 4) != 0) continue; - MemoryMapEntry* entry = &config->MemoryMapEntries[0]; - for (i = 0; i < config->NumMemoryMapEntries; i++) { - DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", entry->Start, - entry->End, entry->Type)); - AddMemoryRange(MemInfoCallback, entry->Start, entry->End, entry->Type); - entry++; + if (cmdline_ints(option, args, 3) != 3) { + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); + continue; + } + + const uint64_t start = args[0]; + const uint64_t end = args[1]; + const uint64_t type = args[2]; + + DEBUG( + (DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", start, end, type)); + AddMemoryRange(MemInfoCallback, start, end, type); + } } + return RETURN_SUCCESS; } @@ -96,14 +201,52 @@ ParseMemoryInfo(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN VOID* Params) { RETURN_STATUS EFIAPI ParseSystemTable(OUT SYSTEM_TABLE_INFO* SystemTableInfo) { - UefiPayloadConfig* config; + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); if + (!config) { + DEBUG((DEBUG_ERROR, + "ParseSystemTable: Could not find UEFI Payload config\n")); + return RETURN_SUCCESS; + } - config = GetUefiPayLoadConfig(); - SystemTableInfo->AcpiTableBase = config->AcpiBase; - SystemTableInfo->AcpiTableSize = config->AcpiSize; + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { + const UefiPayloadConfigV1* config1 = &config->config.v1; + SystemTableInfo->AcpiTableBase = config1->AcpiBase; + SystemTableInfo->AcpiTableSize = config1->AcpiSize; - SystemTableInfo->SmbiosTableBase = config->SmbiosBase; - SystemTableInfo->SmbiosTableSize = config->SmbiosSize; + SystemTableInfo->SmbiosTableBase = config1->SmbiosBase; + SystemTableInfo->SmbiosTableSize = config1->SmbiosSize; } else + + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { + const char* cmdline = config->config.v2.cmdline; + const char* option; + uint64_t args[2]; + + // look for the acpi config + while ((cmdline = cmdline_next(cmdline, &option))) { + if (strncmp(option, "ACPI20=", 7) == 0) { + const int count = cmdline_ints(option, args, 2); + if (count < 0) { + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); + continue; + } + + if (count > 0) SystemTableInfo->AcpiTableBase = args[0]; + if (count > 1) SystemTableInfo->AcpiTableSize = args[1]; + } + + if (strncmp(option, "SMBIOS=", 7) == 0) { + const int count = cmdline_ints(option, args, 2); + if (count < 0) { + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); + continue; + } + + if (count > 0) SystemTableInfo->SmbiosTableBase = args[0]; + if (count > 1) SystemTableInfo->SmbiosTableSize = args[1]; + } + } + } return RETURN_SUCCESS; } @@ -120,15 +263,52 @@ ParseSystemTable(OUT SYSTEM_TABLE_INFO* SystemTableInfo) { RETURN_STATUS EFIAPI ParseSerialInfo(OUT SERIAL_PORT_INFO* SerialPortInfo) { - UefiPayloadConfig* config; - config = GetUefiPayLoadConfig(); - - SerialPortInfo->BaseAddr = config->SerialConfig.BaseAddr; - SerialPortInfo->RegWidth = config->SerialConfig.RegWidth; - SerialPortInfo->Type = config->SerialConfig.Type; - SerialPortInfo->Baud = config->SerialConfig.Baud; - SerialPortInfo->InputHertz = config->SerialConfig.InputHertz; - SerialPortInfo->UartPciAddr = config->SerialConfig.UartPciAddr; + // fill in some reasonable defaults + SerialPortInfo->BaseAddr = 0x3f8; + SerialPortInfo->RegWidth = 1; + SerialPortInfo->Type = 1; // uefi.SerialPortTypeIO + SerialPortInfo->Baud = 115200; SerialPortInfo->InputHertz = 1843200; + SerialPortInfo->UartPciAddr = 0; + + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); if + (!config) { + DEBUG((DEBUG_ERROR, "ParseSerialInfo: using default config\n")); + return RETURN_SUCCESS; + } + + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { + const UefiPayloadConfigV1* config1 = &config->config.v1; + SerialPortInfo->BaseAddr = config1->SerialConfig.BaseAddr; + SerialPortInfo->RegWidth = config1->SerialConfig.RegWidth; + SerialPortInfo->Type = config1->SerialConfig.Type; + SerialPortInfo->Baud = config1->SerialConfig.Baud; + SerialPortInfo->InputHertz = config1->SerialConfig.InputHertz; + SerialPortInfo->UartPciAddr = config1->SerialConfig.UartPciAddr; + } else + + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { + const char* cmdline = config->config.v2.cmdline; + const char* option; + uint64_t args[6] = {}; + + while ((cmdline = cmdline_next(cmdline, &option))) { + if (strncmp(option, "serial=", 7) != 0) continue; + + const int count = cmdline_ints(option, args, 6); + if (count < 0) { + DEBUG((DEBUG_ERROR, "Parse error: %a\n", option)); + continue; + } + + if (count > 0) SerialPortInfo->Baud = args[0]; + if (count > 1) SerialPortInfo->BaseAddr = args[1]; + if (count > 2) SerialPortInfo->RegWidth = args[2]; + if (count > 3) SerialPortInfo->Type = args[3]; + if (count > 4) SerialPortInfo->InputHertz = args[4]; + if (count > 5) SerialPortInfo->UartPciAddr = args[5]; + } + } return RETURN_SUCCESS; } -- 2.32.0.402.g57bb445576-goog ^ permalink raw reply related [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH v1 6/6] UefiPayloadPkg: LinuxBoot: use a text format for the configuration block. 2021-08-04 3:00 ` Guo Dong @ 2021-08-07 13:53 ` Cheng-Chieh Huang 0 siblings, 0 replies; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-08-07 13:53 UTC (permalink / raw) To: Dong, Guo; +Cc: devel@edk2.groups.io, Trammell Hudson [-- Attachment #1: Type: text/plain, Size: 14448 bytes --] Thanks for the information. I will drop this patch in Patch set v2 for now and work with Trammell to revise this patch to fit EDK2 style. -- Cheng-Chieh On Wed, Aug 4, 2021 at 11:00 AM Dong, Guo <guo.dong@intel.com> wrote: > > Please run BaseTools\Scripts\PatchCheck.py to make sure it passed the > check. > > Update LbParseLib.c following > https://edk2-docs.gitbook.io/edk-ii-c-coding-standards-specification/. > current code is more like Linux style. E.g. > +static uint64_t parse_int(const char* s, char** end) { > + UINT64 x; > > Removed unused comments > +//#include <string.h> > +//#include <ctype.h> > > > Thanks, > Guo > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of > Cheng-Chieh Huang via groups.io > Sent: Wednesday, July 21, 2021 6:23 AM > To: devel@edk2.groups.io > Cc: Trammell Hudson <hudson@trmm.net>; Cheng-Chieh Huang < > chengchieh@google.com> > Subject: [edk2-devel] [PATCH v1 6/6] UefiPayloadPkg: LinuxBoot: use a text > format for the configuration block. > > From: Trammell Hudson <hudson@trmm.net> > > This adds a text command line for the UefiPayloadPkg that uses a textual > magic number 'LnxBoot1' and a series of white-space separated > key=value[,value...] pairs for the parameters. > > The v1 binary configuration structure is used if it is present instead for > backwards compatability. > > Currently supported text command line arguments are are: > > * `serial=baud,base,width,type,hz,pci` > (only `baud` needs to be specified, the rest have reasonable > defaults) > > * `mem=start,end,type` > Types are based on `/sys/firmware/memmaps/*/types`: > 1 == "System RAM" > 3 == "ACPI Tables" > 4 == "ACPI Non-volatile Storage" > 5 == "Reserved" > > * `ACPI20=base` pointer to RDSP (from `/sys/firmware/efi/systab`) > > * `SMBIOS=base` pointer to the SMBIOS table (also from the EFI table) > > Signed-off-by: Cheng-Chieh Huang <chengchieh@google.com> > --- > UefiPayloadPkg/Include/Linuxboot.h | 17 +- > UefiPayloadPkg/Library/LbParseLib/LbParseLib.c | 252 +++++++++++++++++--- > 2 files changed, 230 insertions(+), 39 deletions(-) > > diff --git a/UefiPayloadPkg/Include/Linuxboot.h > b/UefiPayloadPkg/Include/Linuxboot.h > index 34ca18069983..56b39b5a09ff 100644 > --- a/UefiPayloadPkg/Include/Linuxboot.h > +++ b/UefiPayloadPkg/Include/Linuxboot.h > @@ -24,8 +24,7 @@ typedef struct MemoryMapEntryStruct { > UINT32 Type; > } MemoryMapEntry; > > -typedef struct UefiPayloadConfigStruct { > - UINT64 Version; > +typedef struct { > UINT64 AcpiBase; > UINT64 AcpiSize; > UINT64 SmbiosBase; > @@ -33,10 +32,22 @@ typedef struct UefiPayloadConfigStruct { > SerialPortConfig SerialConfig; > UINT32 NumMemoryMapEntries; > MemoryMapEntry MemoryMapEntries[0]; > +} UefiPayloadConfigV1; > + > +typedef struct UefiPayloadConfigStruct { > + UINT64 Version; > + union { > + UefiPayloadConfigV1 v1; > + struct { > + char cmdline[0]; // up to 64 KB > + } v2; > + } config; > } UefiPayloadConfig; > #pragma pack() > > -#define UEFI_PAYLOAD_CONFIG_VERSION 1 > +// magic version config is "LnxBoot1" > +#define UEFI_PAYLOAD_CONFIG_VERSION1 1 > +#define UEFI_PAYLOAD_CONFIG_VERSION2 0x31746f6f42786e4cULL > > #define LINUXBOOT_MEM_RAM 1 > #define LINUXBOOT_MEM_DEFAULT 2 > diff --git a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > index 34bfb6a1073f..5e68091cac91 100644 > --- a/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > +++ b/UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > @@ -1,13 +1,12 @@ > /** @file > - This library will parse the linuxboot table in memory and extract those > required > - information. > + This library will parse the linuxboot table in memory and extract > +those required information. > > Copyright (c) 2021, the u-root Authors. All rights reserved.<BR> > SPDX-License-Identifier: BSD-2-Clause-Patent > > **/ > > - > #include <IndustryStandard/Acpi.h> > #include <IndustryStandard/SmBios.h> > #include <Library/BaseLib.h> > @@ -18,17 +17,42 @@ > #include <Library/PcdLib.h> > #include <Linuxboot.h> > #include <Uefi/UefiBaseType.h> > +#include <stdint.h> > +#include <stdlib.h> > +//#include <string.h> > +//#include <ctype.h> > + > +#define strncmp(a, b, n) AsciiStrnCmp((a), (b), (n)) > + > +static uint64_t parse_int(const char* s, char** end) { > + UINT64 x; > + > + if (s[0] == '0' && s[1] == 'x') > + AsciiStrHexToUint64S(s, end, &x); > + else > + AsciiStrDecimalToUint64S(s, end, &x); > + > + return x; > +} > + > +static int isspace(const char c) { return c == ' ' || c == '\t' || c == > +'\n'; } > > // Retrieve UefiPayloadConfig from Linuxboot's uefiboot > -UefiPayloadConfig* GetUefiPayLoadConfig() { > - UefiPayloadConfig* config = > +const UefiPayloadConfig* GetUefiPayLoadConfig() { > + const UefiPayloadConfig* config = > (UefiPayloadConfig*)(UINTN)(PcdGet32(PcdPayloadFdMemBase) - > SIZE_64KB); > - if (config->Version != UEFI_PAYLOAD_CONFIG_VERSION) { > - DEBUG((DEBUG_ERROR, "Expect payload config version: %d, but get %d\n", > - UEFI_PAYLOAD_CONFIG_VERSION, config->Version)); > - CpuDeadLoop (); > - } > - return config; > + > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1 || > + config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) > + return config; > + > + DEBUG((DEBUG_ERROR, > + "Expect payload config version %016lx or %016lx, but get > %016lx\n", > + UEFI_PAYLOAD_CONFIG_VERSION1, UEFI_PAYLOAD_CONFIG_VERSION2, > + config->Version)); > + CpuDeadLoop(); > + while (1) > + ; > } > > // Align the address and add memory rang to MemInfoCallback @@ -54,6 > +78,57 @@ void AddMemoryRange(IN BL_MEM_INFO_CALLBACK MemInfoCallback, IN > UINTN start, > MemInfoCallback(&MemoryMap, NULL); > } > > +const char* cmdline_next(const char* cmdline, const char** option) { > + // at the end of the string, we're done > + if (!cmdline || *cmdline == '\0') return NULL; > + > + // skip any leading whitespace > + while (isspace(*cmdline)) cmdline++; > + > + // if we've hit the end of the string, we're done if (*cmdline == > + '\0') return NULL; > + > + *option = cmdline; > + > + // find the end of this option or the string while > + (!isspace(*cmdline) && *cmdline != '\0') cmdline++; > + > + // cmdline points to the whitespace or end of string > + return cmdline; > +} > + > +int cmdline_ints(const char* option, uint64_t args[], int max) { > + // skip any leading text up to an '=' > + const char* s = option; > + while (1) { > + const char c = *s++; > + if (c == '=') break; > + > + if (c == '\0' || isspace(c)) { > + s = option; > + break; > + } > + } > + > + for (int i = 0; i < max; i++) { > + char* end; > + args[i] = parse_int(s, &end); > + > + // end of string or end of the option? > + if (*end == '\0' || isspace(*end)) return i + 1; > + > + // not separator? signal an error if we have consumed any ints, > + // otherwise return 0 saying that none were found > + if (*end != ',') return i == 0 ? 0 : -1; > + > + // skip the , and get the next value > + s = end + 1; > + } > + > + // too many values! > + return -1; > +} > + > /** > Acquire the memory information from the linuxboot table in memory. > > @@ -67,20 +142,50 @@ void AddMemoryRange(IN BL_MEM_INFO_CALLBACK > MemInfoCallback, IN UINTN start, RETURN_STATUS EFIAPI ParseMemoryInfo(IN > BL_MEM_INFO_CALLBACK MemInfoCallback, IN VOID* Params) { > - UefiPayloadConfig* config; > - int i; > + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); if > + (!config) { > + DEBUG( > + (DEBUG_ERROR, "ParseMemoryInfo: Could not find UEFI Payload > config\n")); > + return RETURN_SUCCESS; > + } > + > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { > + const UefiPayloadConfigV1* config1 = &config->config.v1; > + DEBUG( > + (DEBUG_INFO, "MemoryMap #entries: %d\n", > + config1->NumMemoryMapEntries)); > + > + for (int i = 0; i < config1->NumMemoryMapEntries; i++) { > + const MemoryMapEntry* entry = &config1->MemoryMapEntries[i]; > + DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", > entry->Start, > + entry->End, entry->Type)); > + AddMemoryRange(MemInfoCallback, entry->Start, entry->End, > entry->Type); > + } > + } else > > - config = GetUefiPayLoadConfig(); > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { > + const char* cmdline = config->config.v2.cmdline; > + const char* option; > + uint64_t args[3]; > > - DEBUG((DEBUG_INFO, "MemoryMap #entries: %d\n", > config->NumMemoryMapEntries)); > + // look for the mem=start,end,type > + while ((cmdline = cmdline_next(cmdline, &option))) { > + if (strncmp(option, "mem=", 4) != 0) continue; > > - MemoryMapEntry* entry = &config->MemoryMapEntries[0]; > - for (i = 0; i < config->NumMemoryMapEntries; i++) { > - DEBUG((DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", entry->Start, > - entry->End, entry->Type)); > - AddMemoryRange(MemInfoCallback, entry->Start, entry->End, > entry->Type); > - entry++; > + if (cmdline_ints(option, args, 3) != 3) { > + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); > + continue; > + } > + > + const uint64_t start = args[0]; > + const uint64_t end = args[1]; > + const uint64_t type = args[2]; > + > + DEBUG( > + (DEBUG_INFO, "Start: 0x%lx End: 0x%lx Type:%d\n", start, end, > type)); > + AddMemoryRange(MemInfoCallback, start, end, type); > + } > } > + > return RETURN_SUCCESS; > } > > @@ -96,14 +201,52 @@ ParseMemoryInfo(IN BL_MEM_INFO_CALLBACK > MemInfoCallback, IN VOID* Params) { RETURN_STATUS EFIAPI > ParseSystemTable(OUT SYSTEM_TABLE_INFO* SystemTableInfo) { > - UefiPayloadConfig* config; > + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); if > + (!config) { > + DEBUG((DEBUG_ERROR, > + "ParseSystemTable: Could not find UEFI Payload config\n")); > + return RETURN_SUCCESS; > + } > > - config = GetUefiPayLoadConfig(); > - SystemTableInfo->AcpiTableBase = config->AcpiBase; > - SystemTableInfo->AcpiTableSize = config->AcpiSize; > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { > + const UefiPayloadConfigV1* config1 = &config->config.v1; > + SystemTableInfo->AcpiTableBase = config1->AcpiBase; > + SystemTableInfo->AcpiTableSize = config1->AcpiSize; > > - SystemTableInfo->SmbiosTableBase = config->SmbiosBase; > - SystemTableInfo->SmbiosTableSize = config->SmbiosSize; > + SystemTableInfo->SmbiosTableBase = config1->SmbiosBase; > + SystemTableInfo->SmbiosTableSize = config1->SmbiosSize; } else > + > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { > + const char* cmdline = config->config.v2.cmdline; > + const char* option; > + uint64_t args[2]; > + > + // look for the acpi config > + while ((cmdline = cmdline_next(cmdline, &option))) { > + if (strncmp(option, "ACPI20=", 7) == 0) { > + const int count = cmdline_ints(option, args, 2); > + if (count < 0) { > + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); > + continue; > + } > + > + if (count > 0) SystemTableInfo->AcpiTableBase = args[0]; > + if (count > 1) SystemTableInfo->AcpiTableSize = args[1]; > + } > + > + if (strncmp(option, "SMBIOS=", 7) == 0) { > + const int count = cmdline_ints(option, args, 2); > + if (count < 0) { > + DEBUG((DEBUG_ERROR, "Parse error: '%a'\n", option)); > + continue; > + } > + > + if (count > 0) SystemTableInfo->SmbiosTableBase = args[0]; > + if (count > 1) SystemTableInfo->SmbiosTableSize = args[1]; > + } > + } > + } > > return RETURN_SUCCESS; > } > @@ -120,15 +263,52 @@ ParseSystemTable(OUT SYSTEM_TABLE_INFO* > SystemTableInfo) { RETURN_STATUS EFIAPI ParseSerialInfo(OUT > SERIAL_PORT_INFO* SerialPortInfo) { > - UefiPayloadConfig* config; > - config = GetUefiPayLoadConfig(); > - > - SerialPortInfo->BaseAddr = config->SerialConfig.BaseAddr; > - SerialPortInfo->RegWidth = config->SerialConfig.RegWidth; > - SerialPortInfo->Type = config->SerialConfig.Type; > - SerialPortInfo->Baud = config->SerialConfig.Baud; > - SerialPortInfo->InputHertz = config->SerialConfig.InputHertz; > - SerialPortInfo->UartPciAddr = config->SerialConfig.UartPciAddr; > + // fill in some reasonable defaults > + SerialPortInfo->BaseAddr = 0x3f8; > + SerialPortInfo->RegWidth = 1; > + SerialPortInfo->Type = 1; // uefi.SerialPortTypeIO > + SerialPortInfo->Baud = 115200; SerialPortInfo->InputHertz = 1843200; > + SerialPortInfo->UartPciAddr = 0; > + > + const UefiPayloadConfig* config = GetUefiPayLoadConfig(); if > + (!config) { > + DEBUG((DEBUG_ERROR, "ParseSerialInfo: using default config\n")); > + return RETURN_SUCCESS; > + } > + > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION1) { > + const UefiPayloadConfigV1* config1 = &config->config.v1; > + SerialPortInfo->BaseAddr = config1->SerialConfig.BaseAddr; > + SerialPortInfo->RegWidth = config1->SerialConfig.RegWidth; > + SerialPortInfo->Type = config1->SerialConfig.Type; > + SerialPortInfo->Baud = config1->SerialConfig.Baud; > + SerialPortInfo->InputHertz = config1->SerialConfig.InputHertz; > + SerialPortInfo->UartPciAddr = config1->SerialConfig.UartPciAddr; > + } else > + > + if (config->Version == UEFI_PAYLOAD_CONFIG_VERSION2) { > + const char* cmdline = config->config.v2.cmdline; > + const char* option; > + uint64_t args[6] = {}; > + > + while ((cmdline = cmdline_next(cmdline, &option))) { > + if (strncmp(option, "serial=", 7) != 0) continue; > + > + const int count = cmdline_ints(option, args, 6); > + if (count < 0) { > + DEBUG((DEBUG_ERROR, "Parse error: %a\n", option)); > + continue; > + } > + > + if (count > 0) SerialPortInfo->Baud = args[0]; > + if (count > 1) SerialPortInfo->BaseAddr = args[1]; > + if (count > 2) SerialPortInfo->RegWidth = args[2]; > + if (count > 3) SerialPortInfo->Type = args[3]; > + if (count > 4) SerialPortInfo->InputHertz = args[4]; > + if (count > 5) SerialPortInfo->UartPciAddr = args[5]; > + } > + } > > return RETURN_SUCCESS; > } > -- > 2.32.0.402.g57bb445576-goog > > > > > > > [-- Attachment #2: Type: text/html, Size: 17934 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* 回复: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload 2021-07-21 13:23 [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload Cheng-Chieh Huang ` (5 preceding siblings ...) 2021-07-21 13:23 ` [PATCH v1 6/6] UefiPayloadPkg: LinuxBoot: use a text format for the configuration block Cheng-Chieh Huang @ 2021-07-22 1:29 ` gaoliming 2021-07-22 3:40 ` Cheng-Chieh Huang 2021-07-22 1:44 ` Ni, Ray 7 siblings, 1 reply; 33+ messages in thread From: gaoliming @ 2021-07-22 1:29 UTC (permalink / raw) To: devel, chengchieh Cc: 'Daniel Schaefer', 'Trammell Hudson', 'Maurice Ma', 'Guo Dong', 'Benjamin You' This is new feature. Can you submit one BZ (https://bugzilla.tianocore.org/ ) for it? Thanks Liming > -----邮件原件----- > 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Cheng-Chieh > Huang via groups.io > 发送时间: 2021年7月21日 21:23 > 收件人: devel@edk2.groups.io > 抄送: Cheng-Chieh Huang <chengchieh@google.com>; Daniel Schaefer > <daniel.schaefer@hpe.com>; Trammell Hudson <hudson@trmm.net>; > Maurice Ma <maurice.ma@intel.com>; Guo Dong <guo.dong@intel.com>; > Benjamin You <benjamin.you@intel.com> > 主题: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in > UefiPayload > > These are necessary patches to Support LinuxBoot in UefiPayload. > With these paches, we can boot to ESXi and Windows from a linux in QEMU. > > LinuxBoot README: > https://github.com/linuxboot/edk2/blob/uefipayload/UefiPayloadPkg/READM > E.md > > PR to tianocore: > https://github.com/tianocore/edk2/pull/1820 > > Cheng-Chieh Huang (5): > Add LINUXBOOT payload target > Use legacy timer in Linuxboot payload > Update maximum logic processor to 256 > Reserve Payload config in runtime services data > Add DISABLE_MMX_SSE to avoid generating floating points operation > > Trammell Hudson (1): > LinuxBoot: use a text format for the configuration block. > > UefiPayloadPkg/UefiPayloadPkg.dsc | 29 +- > UefiPayloadPkg/UefiPayloadPkg.fdf | 5 + > .../Library/LbParseLib/LbParseLib.inf | 39 ++ > UefiPayloadPkg/Include/Linuxboot.h | 58 +++ > .../Library/LbParseLib/LbParseLib.c | 348 > ++++++++++++++++++ > .../PciHostBridgeLib/PciHostBridgeSupport.c | 6 +- > .../UefiPayloadEntry/UefiPayloadEntry.c | 2 + > CryptoPkg/Library/OpensslLib/openssl | 2 +- > 8 files changed, 480 insertions(+), 9 deletions(-) > create mode 100644 UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf > create mode 100644 UefiPayloadPkg/Include/Linuxboot.h > create mode 100644 UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > > Cc: Cheng-Chieh Huang <chengchieh@google.com> > Cc: Daniel Schaefer <daniel.schaefer@hpe.com> > Cc: Trammell Hudson <hudson@trmm.net> > Cc: Maurice Ma <maurice.ma@intel.com> > Cc: Guo Dong <guo.dong@intel.com> > Cc: Benjamin You <benjamin.you@intel.com> > -- > 2.32.0.402.g57bb445576-goog > > > > > ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload 2021-07-22 1:29 ` 回复: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload gaoliming @ 2021-07-22 3:40 ` Cheng-Chieh Huang 0 siblings, 0 replies; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-22 3:40 UTC (permalink / raw) To: gaoliming Cc: devel, Daniel Schaefer, Trammell Hudson, Maurice Ma, Guo Dong, Benjamin You [-- Attachment #1: Type: text/plain, Size: 2680 bytes --] Bug created: https://bugzilla.tianocore.org/show_bug.cgi?id=3505 On Thu, Jul 22, 2021 at 9:29 AM gaoliming <gaoliming@byosoft.com.cn> wrote: > This is new feature. Can you submit one BZ ( > https://bugzilla.tianocore.org/ ) for it? > > Thanks > Liming > > -----邮件原件----- > > 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Cheng-Chieh > > Huang via groups.io > > 发送时间: 2021年7月21日 21:23 > > 收件人: devel@edk2.groups.io > > 抄送: Cheng-Chieh Huang <chengchieh@google.com>; Daniel Schaefer > > <daniel.schaefer@hpe.com>; Trammell Hudson <hudson@trmm.net>; > > Maurice Ma <maurice.ma@intel.com>; Guo Dong <guo.dong@intel.com>; > > Benjamin You <benjamin.you@intel.com> > > 主题: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in > > UefiPayload > > > > These are necessary patches to Support LinuxBoot in UefiPayload. > > With these paches, we can boot to ESXi and Windows from a linux in QEMU. > > > > LinuxBoot README: > > https://github.com/linuxboot/edk2/blob/uefipayload/UefiPayloadPkg/READM > > E.md > > > > PR to tianocore: > > https://github.com/tianocore/edk2/pull/1820 > > > > Cheng-Chieh Huang (5): > > Add LINUXBOOT payload target > > Use legacy timer in Linuxboot payload > > Update maximum logic processor to 256 > > Reserve Payload config in runtime services data > > Add DISABLE_MMX_SSE to avoid generating floating points operation > > > > Trammell Hudson (1): > > LinuxBoot: use a text format for the configuration block. > > > > UefiPayloadPkg/UefiPayloadPkg.dsc | 29 +- > > UefiPayloadPkg/UefiPayloadPkg.fdf | 5 + > > .../Library/LbParseLib/LbParseLib.inf | 39 ++ > > UefiPayloadPkg/Include/Linuxboot.h | 58 +++ > > .../Library/LbParseLib/LbParseLib.c | 348 > > ++++++++++++++++++ > > .../PciHostBridgeLib/PciHostBridgeSupport.c | 6 +- > > .../UefiPayloadEntry/UefiPayloadEntry.c | 2 + > > CryptoPkg/Library/OpensslLib/openssl | 2 +- > > 8 files changed, 480 insertions(+), 9 deletions(-) > > create mode 100644 UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf > > create mode 100644 UefiPayloadPkg/Include/Linuxboot.h > > create mode 100644 UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > > > > Cc: Cheng-Chieh Huang <chengchieh@google.com> > > Cc: Daniel Schaefer <daniel.schaefer@hpe.com> > > Cc: Trammell Hudson <hudson@trmm.net> > > Cc: Maurice Ma <maurice.ma@intel.com> > > Cc: Guo Dong <guo.dong@intel.com> > > Cc: Benjamin You <benjamin.you@intel.com> > > -- > > 2.32.0.402.g57bb445576-goog > > > > > > > > > > > > > > [-- Attachment #2: Type: text/html, Size: 4721 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload 2021-07-21 13:23 [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload Cheng-Chieh Huang ` (6 preceding siblings ...) 2021-07-22 1:29 ` 回复: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload gaoliming @ 2021-07-22 1:44 ` Ni, Ray 2021-07-22 1:58 ` Daniel Schaefer 7 siblings, 1 reply; 33+ messages in thread From: Ni, Ray @ 2021-07-22 1:44 UTC (permalink / raw) To: devel@edk2.groups.io, chengchieh@google.com Cc: Schaefer, Daniel, Trammell Hudson, Ma, Maurice, Dong, Guo, You, Benjamin Cheng-Chieh, Thanks for the detailed explanation in doc https://docs.google.com/document/d/1mU6ICHTh0ot8U45uuRENKOGI8cVzizdyWHGYHpEguVg/edit#heading=h.xzptrog8pyxf. My original thought was LinuxBoot is a payload that aims to boot OS. But the idea of chaining UefiPayload producing UEFI services is very brilliant. Have you considered to produce the universal payload interfaces (https://universalpayload.github.io/documentation/) from LinuxBoot so no LbParseLib is required? Thanks, Ray > -----Original Message----- > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Cheng-Chieh Huang via groups.io > Sent: Wednesday, July 21, 2021 9:23 PM > To: devel@edk2.groups.io > Cc: Cheng-Chieh Huang <chengchieh@google.com>; Schaefer, Daniel <daniel.schaefer@hpe.com>; Trammell Hudson > <hudson@trmm.net>; Ma, Maurice <maurice.ma@intel.com>; Dong, Guo <guo.dong@intel.com>; You, Benjamin > <benjamin.you@intel.com> > Subject: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload > > These are necessary patches to Support LinuxBoot in UefiPayload. > With these paches, we can boot to ESXi and Windows from a linux in QEMU. > > LinuxBoot README: > https://github.com/linuxboot/edk2/blob/uefipayload/UefiPayloadPkg/README.md > > PR to tianocore: > https://github.com/tianocore/edk2/pull/1820 > > Cheng-Chieh Huang (5): > Add LINUXBOOT payload target > Use legacy timer in Linuxboot payload > Update maximum logic processor to 256 > Reserve Payload config in runtime services data > Add DISABLE_MMX_SSE to avoid generating floating points operation > > Trammell Hudson (1): > LinuxBoot: use a text format for the configuration block. > > UefiPayloadPkg/UefiPayloadPkg.dsc | 29 +- > UefiPayloadPkg/UefiPayloadPkg.fdf | 5 + > .../Library/LbParseLib/LbParseLib.inf | 39 ++ > UefiPayloadPkg/Include/Linuxboot.h | 58 +++ > .../Library/LbParseLib/LbParseLib.c | 348 ++++++++++++++++++ > .../PciHostBridgeLib/PciHostBridgeSupport.c | 6 +- > .../UefiPayloadEntry/UefiPayloadEntry.c | 2 + > CryptoPkg/Library/OpensslLib/openssl | 2 +- > 8 files changed, 480 insertions(+), 9 deletions(-) > create mode 100644 UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf > create mode 100644 UefiPayloadPkg/Include/Linuxboot.h > create mode 100644 UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > > Cc: Cheng-Chieh Huang <chengchieh@google.com> > Cc: Daniel Schaefer <daniel.schaefer@hpe.com> > Cc: Trammell Hudson <hudson@trmm.net> > Cc: Maurice Ma <maurice.ma@intel.com> > Cc: Guo Dong <guo.dong@intel.com> > Cc: Benjamin You <benjamin.you@intel.com> > -- > 2.32.0.402.g57bb445576-goog > > > > > ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload 2021-07-22 1:44 ` Ni, Ray @ 2021-07-22 1:58 ` Daniel Schaefer 2021-07-22 2:48 ` Cheng-Chieh Huang 0 siblings, 1 reply; 33+ messages in thread From: Daniel Schaefer @ 2021-07-22 1:58 UTC (permalink / raw) To: Ni, Ray, devel@edk2.groups.io, chengchieh@google.com, Trammell Hudson Cc: Ma, Maurice, Dong, Guo, You, Benjamin On 7/22/21 9:44 AM, Ni, Ray wrote: > Cheng-Chieh, > Thanks for the detailed explanation in doc https://docs.google.com/document/d/1mU6ICHTh0ot8U45uuRENKOGI8cVzizdyWHGYHpEguVg/edit#heading=h.xzptrog8pyxf . > > My original thought was LinuxBoot is a payload that aims to boot OS. > But the idea of chaining UefiPayload producing UEFI services is very brilliant. It can be and it is. The main usage of LinuxBoot is to load/boot another Linux using the kexec mechanism. But in order to be able to boot Windows, ESXI, ... a UEFI interface is required. There have been a few proposals and POCs (like implementing UEFI services in Linux) but UefiPayload is the most practical and easy way to do it, for now. > Have you considered to produce the universal payload interfaces (https://universalpayload.github.io/documentation/ ) from LinuxBoot so no LbParseLib is required? I don't think we've looked at it. But we liked it to be a string because it allows easy forward compatibility and not having to recreate the structs in higher-level languages like Go. > Thanks, > Ray > >> -----Original Message----- >> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Cheng-Chieh Huang via groups.io >> Sent: Wednesday, July 21, 2021 9:23 PM >> To: devel@edk2.groups.io >> Cc: Cheng-Chieh Huang <chengchieh@google.com>; Schaefer, Daniel <daniel.schaefer@hpe.com>; Trammell Hudson >> <hudson@trmm.net>; Ma, Maurice <maurice.ma@intel.com>; Dong, Guo <guo.dong@intel.com>; You, Benjamin >> <benjamin.you@intel.com> >> Subject: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload >> >> These are necessary patches to Support LinuxBoot in UefiPayload. >> With these paches, we can boot to ESXi and Windows from a linux in QEMU. >> >> LinuxBoot README: >> https://github.com/linuxboot/edk2/blob/uefipayload/UefiPayloadPkg/README.md >> >> PR to tianocore: >> https://github.com/tianocore/edk2/pull/1820 >> >> Cheng-Chieh Huang (5): >> Add LINUXBOOT payload target >> Use legacy timer in Linuxboot payload >> Update maximum logic processor to 256 >> Reserve Payload config in runtime services data >> Add DISABLE_MMX_SSE to avoid generating floating points operation >> >> Trammell Hudson (1): >> LinuxBoot: use a text format for the configuration block. >> >> UefiPayloadPkg/UefiPayloadPkg.dsc | 29 +- >> UefiPayloadPkg/UefiPayloadPkg.fdf | 5 + >> .../Library/LbParseLib/LbParseLib.inf | 39 ++ >> UefiPayloadPkg/Include/Linuxboot.h | 58 +++ >> .../Library/LbParseLib/LbParseLib.c | 348 ++++++++++++++++++ >> .../PciHostBridgeLib/PciHostBridgeSupport.c | 6 +- >> .../UefiPayloadEntry/UefiPayloadEntry.c | 2 + >> CryptoPkg/Library/OpensslLib/openssl | 2 +- >> 8 files changed, 480 insertions(+), 9 deletions(-) >> create mode 100644 UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf >> create mode 100644 UefiPayloadPkg/Include/Linuxboot.h >> create mode 100644 UefiPayloadPkg/Library/LbParseLib/LbParseLib.c >> >> Cc: Cheng-Chieh Huang <chengchieh@google.com> >> Cc: Daniel Schaefer <daniel.schaefer@hpe.com> >> Cc: Trammell Hudson <hudson@trmm.net> >> Cc: Maurice Ma <maurice.ma@intel.com> >> Cc: Guo Dong <guo.dong@intel.com> >> Cc: Benjamin You <benjamin.you@intel.com> >> -- >> 2.32.0.402.g57bb445576-goog >> >> >> >> >> > ^ permalink raw reply [flat|nested] 33+ messages in thread
* Re: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload 2021-07-22 1:58 ` Daniel Schaefer @ 2021-07-22 2:48 ` Cheng-Chieh Huang 0 siblings, 0 replies; 33+ messages in thread From: Cheng-Chieh Huang @ 2021-07-22 2:48 UTC (permalink / raw) To: Daniel Schaefer Cc: Ni, Ray, devel@edk2.groups.io, Trammell Hudson, Ma, Maurice, Dong, Guo, You, Benjamin [-- Attachment #1: Type: text/plain, Size: 3785 bytes --] On Thu, Jul 22, 2021 at 9:59 AM Daniel Schaefer <daniel.schaefer@hpe.com> wrote: > On 7/22/21 9:44 AM, Ni, Ray wrote: > > Cheng-Chieh, > > Thanks for the detailed explanation in doc > https://docs.google.com/document/d/1mU6ICHTh0ot8U45uuRENKOGI8cVzizdyWHGYHpEguVg/edit#heading=h.xzptrog8pyxf > . > > > > My original thought was LinuxBoot is a payload that aims to boot OS. > > But the idea of chaining UefiPayload producing UEFI services is very > brilliant. > > It can be and it is. The main usage of LinuxBoot is to load/boot another > Linux using the kexec mechanism. But in order to be able to boot > Windows, ESXI, ... a UEFI interface is required. > There have been a few proposals and POCs (like implementing UEFI > services in Linux) but UefiPayload is the most practical and easy way to > do it, for now. > > > Have you considered to produce the universal payload interfaces ( > https://universalpayload.github.io/documentation/ ) from LinuxBoot so no > LbParseLib is required? > > I don't think we've looked at it. But we liked it to be a string because > it allows easy forward compatibility and not having to recreate the > structs in higher-level languages like Go. > > Agree to Daniel. In the future, we can look for supporting HOB structure in u-root, but for now, we prefer to stick with the current approach. -- Cheng-Chieh > > Thanks, > > Ray > > > >> -----Original Message----- > >> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of > Cheng-Chieh Huang via groups.io > >> Sent: Wednesday, July 21, 2021 9:23 PM > >> To: devel@edk2.groups.io > >> Cc: Cheng-Chieh Huang <chengchieh@google.com>; Schaefer, Daniel < > daniel.schaefer@hpe.com>; Trammell Hudson > >> <hudson@trmm.net>; Ma, Maurice <maurice.ma@intel.com>; Dong, Guo < > guo.dong@intel.com>; You, Benjamin > >> <benjamin.you@intel.com> > >> Subject: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in > UefiPayload > >> > >> These are necessary patches to Support LinuxBoot in UefiPayload. > >> With these paches, we can boot to ESXi and Windows from a linux in QEMU. > >> > >> LinuxBoot README: > >> > https://github.com/linuxboot/edk2/blob/uefipayload/UefiPayloadPkg/README.md > >> > >> PR to tianocore: > >> https://github.com/tianocore/edk2/pull/1820 > >> > >> Cheng-Chieh Huang (5): > >> Add LINUXBOOT payload target > >> Use legacy timer in Linuxboot payload > >> Update maximum logic processor to 256 > >> Reserve Payload config in runtime services data > >> Add DISABLE_MMX_SSE to avoid generating floating points operation > >> > >> Trammell Hudson (1): > >> LinuxBoot: use a text format for the configuration block. > >> > >> UefiPayloadPkg/UefiPayloadPkg.dsc | 29 +- > >> UefiPayloadPkg/UefiPayloadPkg.fdf | 5 + > >> .../Library/LbParseLib/LbParseLib.inf | 39 ++ > >> UefiPayloadPkg/Include/Linuxboot.h | 58 +++ > >> .../Library/LbParseLib/LbParseLib.c | 348 ++++++++++++++++++ > >> .../PciHostBridgeLib/PciHostBridgeSupport.c | 6 +- > >> .../UefiPayloadEntry/UefiPayloadEntry.c | 2 + > >> CryptoPkg/Library/OpensslLib/openssl | 2 +- > >> 8 files changed, 480 insertions(+), 9 deletions(-) > >> create mode 100644 UefiPayloadPkg/Library/LbParseLib/LbParseLib.inf > >> create mode 100644 UefiPayloadPkg/Include/Linuxboot.h > >> create mode 100644 UefiPayloadPkg/Library/LbParseLib/LbParseLib.c > >> > >> Cc: Cheng-Chieh Huang <chengchieh@google.com> > >> Cc: Daniel Schaefer <daniel.schaefer@hpe.com> > >> Cc: Trammell Hudson <hudson@trmm.net> > >> Cc: Maurice Ma <maurice.ma@intel.com> > >> Cc: Guo Dong <guo.dong@intel.com> > >> Cc: Benjamin You <benjamin.you@intel.com> > >> -- > >> 2.32.0.402.g57bb445576-goog > >> > >> > >> > >> > >> > > > [-- Attachment #2: Type: text/html, Size: 6424 bytes --] ^ permalink raw reply [flat|nested] 33+ messages in thread
end of thread, other threads:[~2021-08-07 13:53 UTC | newest] Thread overview: 33+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2021-07-21 13:23 [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload Cheng-Chieh Huang 2021-07-21 13:23 ` [PATCH v1 1/6] UefiPayloadPkg: Add LINUXBOOT payload target Cheng-Chieh Huang 2021-08-04 2:41 ` [edk2-devel] " Guo Dong 2021-07-21 13:23 ` [PATCH v1 2/6] UefiPayloadPkg: Use legacy timer in Linuxboot payload Cheng-Chieh Huang 2021-08-04 2:22 ` [edk2-devel] " Guo Dong [not found] ` <1697F93BEFA774AB.32148@groups.io> 2021-08-04 2:52 ` Guo Dong 2021-07-21 13:23 ` [PATCH v1 3/6] UefiPayloadPkg: Update maximum logic processor to 256 Cheng-Chieh Huang 2021-08-04 2:22 ` [edk2-devel] " Guo Dong [not found] ` <1697F92B243CA725.1963@groups.io> 2021-08-04 2:51 ` Guo Dong 2021-07-21 13:23 ` [PATCH v1 4/6] UefiPayloadPkg: Reserve Payload config in runtime services data Cheng-Chieh Huang 2021-08-04 2:44 ` [edk2-devel] " Guo Dong 2021-08-04 6:23 ` Cheng-Chieh Huang 2021-08-04 13:37 ` Guo Dong 2021-07-21 13:23 ` [PATCH v1 5/6] UefiPayloadPkg: Add DISABLE_MMX_SSE to avoid generating floating points operation Cheng-Chieh Huang 2021-07-21 16:34 ` [edk2-devel] " Michael D Kinney 2021-07-21 17:42 ` Cheng-Chieh Huang 2021-07-22 1:28 ` 回复: " gaoliming 2021-07-22 2:35 ` Cheng-Chieh Huang 2021-07-23 10:28 ` 回复: " gaoliming 2021-07-23 11:16 ` Cheng-Chieh Huang 2021-07-23 16:45 ` Michael D Kinney 2021-07-23 17:17 ` Cheng-Chieh Huang 2021-07-23 18:38 ` Michael D Kinney 2021-07-21 13:23 ` [PATCH v1 6/6] UefiPayloadPkg: LinuxBoot: use a text format for the configuration block Cheng-Chieh Huang 2021-07-21 17:09 ` [edk2-devel] " Marvin Häuser 2021-07-22 13:48 ` Cheng-Chieh Huang 2021-08-04 3:00 ` Guo Dong 2021-08-07 13:53 ` Cheng-Chieh Huang 2021-07-22 1:29 ` 回复: [edk2-devel] [PATCH 0/6] UefiPayloadPkg: LinuxBoot Support in UefiPayload gaoliming 2021-07-22 3:40 ` Cheng-Chieh Huang 2021-07-22 1:44 ` Ni, Ray 2021-07-22 1:58 ` Daniel Schaefer 2021-07-22 2:48 ` Cheng-Chieh Huang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox